Çıkış tampon kullanarak - - PHP header bir formu gönderme zaman çalışmıyor yönlendirmek ancak diğer durumlarda yapar?

6 Cevap php

I have an unusual problem, only happening on one server. Following code

....
elseif ($_GET['action']=='login') {

 if (empty($_POST['login_name'])) { $_POST['login_name']=''; }
 if (empty($_POST['login_pass'])) { $_POST['login_pass']=''; }
 if (!empty($_POST['send'])) {
  if (($_POST['login_name']==_ADMIN_NAME) and    ($_POST['login_pass']==_ADMIN_PASS)) {
   //Successfully logged in
   $_SESSION['logged']=1;

// DOES NOT WORK
   header('Location: '.$filename);
   die('Command '.$filename);
  }
 }
// Show Form;
include('plogin.inc.php');
} 
elseif ($_GET['action']=='logout') {
 $_SESSION['logged']=-1;
// DOES WORK!
 header('Location: '.$filename);
}

So the problem is this if i click the link logout, all goes well and i get redirected to $filename. If i submit the login form it checks if the post is correct, set's the session var, but then dies instead of redirecting.

Kesinlikle geçer olsa ben form ile göndermek zaman, tüm hata raporlama ama (hiçbir hata), bu on çıkış tamponları yönlendirmek vermiyor var (oturum var ayarlayın ve ben kalıp parçası almak çünkü)

What could be the cause for this behavior? Thanks

6 Cevap

Ben, ayrıca, bulunan yönlendirme POST isteğindeki sonra bazen çalışmıyor. Bu bir tarayıcı değil sunucu tarafında bir sorun, ben düşünüyorum.

Ben böyle bir şey kullanın:

if( sizeof( $_POST ) == 0 ) header( "Location: " . $url );
else echo '<html><head><meta http-equiv="refresh" content="1;url=' . $url . '"/></head><body>Redirecting to ' . $url . '</body></html>'

Kısacası, bir POST isteği ise - o zaman ben başka, html yenileme yönlendirme kullanmak - Normal başlık yönlendirme.

basit bir şey olabilir. Header () işlevi bir başlığı ayarlamak, ancak sayfa başlığı () çağrıldıktan sonra turnike gönderilir, böylece bir senaryoyu sonlandırmak değil.

Sen php istemci komut sonucu göndermek yapmak gerekir. Çıktı tamponlama kullanmak gibi sizin çıkışı tetikleyebilir kadar, bu sonuç, geri tutulur. Bunun yerine bu deneyin:

header('Location: '.$filename);
ob_end_flush();
exit();

Regards, Mario

Ile hat

die('Command '.$filename);

muhtemelen suçlu olacaktır. die (veya exit) fonksiyonları (ya da aslında dil yapıları) bir parametre olarak bir dize alırsak, o durdurulması önce diğer tarafta yazdırılır. PHP başlıkları gönderme eğer çıkış şey için çalışıyorum sevmez.

Eğer makul yeni PHP (> = 4.3.0 iirc) kullanıyorsanız, basılı olmayacak olan, (isterseniz) çıkış koşulları işaretlemek tamsayılar 0 .. 255 kullanabilirsiniz.

Eğer bir yönlendirme gönderdiğinizde, PHP HTTP Response başlığında değerler koyar. Vücut başlığını izler. Eğer Kafa işlevini kullanmadan önce / baskısını değeri her türlü echo Yanıt Başlıkları dışarı zaten bu yana, bu nedenle, başarısız olur. Herhangi bir metni yazdırmadan önce aynı komut dosyası deneyin ve işe yarayacaktır.

Normal HTTP Response

HTTP/1.1 200 OK Date: Wed, 12 Jan 2011 18:40:22 GMT Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 X-Powered-By: PHP/5.2.14 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html

[Mesajın Organ]

HTTP/1.1 302 Found Date: Wed, 12 Jan 2011 18:40:22 GMT Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 X-Powered-By: PHP/5.2.14 Location: profile.php Content-Type: text/html

Eğer yönlendirme yapıyoruz benim deneyimlerinden herhangi bir içerik göndermek olamaz. Yani senin sorunun kalıp () parametresi olduğunu tahmin ediyorum.

Ben şu anda belgelerinde bu bulamıyorum ama bir parametre olmadan) (ölüyor deneyin ya da sadece çıkış kullanmak; Ben işe bahis.

   header('Location: '.$filename);
flush(); //Try to force server to send header before script die
   die('Command '.$filename);

I had the same problem: script: header('Location: ...'); die();

Script before sending headers received some data via POST, and if data new make changes to DB. It is curious, when POST data small and little changes to DB redirect WORK, when POST data bigger and a lot of changes to DB redirect DON'T WORK. Using flush() after header() solve my problem.

PHP Version 5.2.17 Apache/2.2.3 (CentOS)

Bence, bu tampon sunucu itme başlıklarına gibi görünüyor ve kullanıcıya tampon içeriği göndermeden önce ölür, ve floş () yardım neden olmasıdır.

If flush does not working, see comments about output buffering settings and zlib.compression: http://ru2.php.net/manual/en/function.flush.php