2009-04-28 11 views
1

私は珍しい問題を抱えていますが、1台のサーバーでしか発生しません。次のコード 出力バッファを使用してフォームをポストすると、PHPヘッダーリダイレクトが機能しませんが、それ以外の場合はどうなりますか?

.... 
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); 
} 

だから、問題はこれは私がリンクのログアウトをクリックすると、すべてがうまく行くと、私は$ファイル名にリダイレクトされます。 私はログインフォームを送信すると、投稿が正しいかどうかをチェックし、セッション変数を設定しますが、リダイレクトするのではなく終了します。

すべてのエラーが報告されていますが(エラーはありません)、フォームに投稿したときにリダイレクトされません(セッション変数が設定されていて、

この現象の原因は何ですか? ありがとう

答えて

1

は簡単なことかもしれません。 header()関数はヘッダーを設定しますが、header()を呼び出した後すぐにヘッダーが送信されるようにスクリプトを終了しません。

PHPにスクリプト結果をクライアントに送信する必要があります。出力バッファリングを使用すると、出力をトリガーするまでこの結果は保持されます。代わりにこれを試してみてください:

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

よろしく、 マリオ

+0

おかげで、しかし同じ結果:フラッシュが動作しない場合は

、出力バッファリング設定とzlib.compressionについてのコメントを参照してください。 – Moak

2

あなたは、a)のコードに達すると、b)エラー報告が本当に有効であることをテストしましたか?

die('Command '.$filename); 

//Successfully logged in 
$_SESSION['logged']=1;
// code reached, error_reporting test echo 'debug: would send location header', $filename, $unsetVariableTriggeringWarning; flush();
if (headers_sent()) { die('cannot send location header (anymore)'); } else { header('Location: '.$filename); die(); }

+0

はこれを "持っています"場所のヘッダを送信しますNotice:未定義の変数:unsetVariableTriggeringWarning /var/kunden/webs/***/pbook.inc.php 250行 "しかし、 " – Moak

+0

flush()でさえ?まだいくつかのob_xyz() - バッファがアクティブですか?エコー 'ob_level:'、ob_get_level();伝えることができます。 echo 'debug:ロケーションヘッダを送信します'、$ filename、$ unset ...のバージョンを使用しましたか?私は後でそれを編集した。 – VolkerK

+0

私はファイル名が正しく設定されていることを知っています。前にも述べたように、ヘッダのリダイレクトはログインとログアウトで全く同じです。唯一の違いは、リンクを介してアクセスされ、フォーム提出を介してアクセスされることです。私はerror_reporting(E_ALL)を持っています。 – Moak

1

ラインは、おそらく犯人だろう。 die(またはexit)関数(または実際には言語構造体)が文字列をパラメータとして受け取った場合、それは停止する前に相手側に出力されます。 PHPはあなたがヘッダーを送る場合に何かを出力しようとしません。

合理的に新しいPHP(> = 4.3.0 iirc)を使用している場合は、整数0..255を使用して終了条件をマークすることができます。

+0

にしていたのですが、実際にはこれをデバッグ用に追加しただけで、終了時にテキストがあってもなくても動作しません。 – Moak

+0

スクリプトを故意に終了させるには、パラメータやカッコを必要としないので、 'exit;'だけを使います。私はデバッグのために 'die( 'some error');を使用するので、どのコードをプロダクションに残すべきかは常に明白です。 – Walf

3

また、リダイレクトがPOSTリクエスト後に動作しないことが判明しました。それはサーバー側の問題ではないブラウザだと私は思います。それはPOSTリクエストであれば、要するに

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>' 

通常のヘッダリダイレクト - - その後、私はhtmlのリフレッシュリダイレクトを、それ以外の使用:

私はこのようなものを使用します。

+0

ちょっとgreate、私はそれがPOSTと関係があると信じている人:)しかし、これは本当にちょうど1つのサーバーではなく、他の人で起こっている。今のところ私はあなたの修正を使用します – Moak

0

私の経験では、リダイレクトを行うときにコンテンツを送信することはできません。だからあなたの問題はdie()パラメータだと思います。

これはドキュメント内では今見つけることができませんが、パラメータなしで終了するか、exitを使用してください。私はそれがうまくいくと思う。

+0

いいえ、申し訳ありませんが、私はhenrik、exit()die()テキストの有無にかかわらず、パラメータを削除しました。フォームが送信された場合ではなく、単なるリンクの場合にも同じコードが動作します。 – Moak

1

リダイレクトを送信すると、PHPは値をHTTP応答ヘッダーに入れます。本文はヘッダーに従います。したがって、ヘッダー機能を使用する前に任意の種類の値をエコー/プリントすると、レスポンスヘッダーが既に出力されているため、失敗します。テキストを印刷する前に同じスクリプトを試してください。

通常のHTTPレスポンス

HTTP/1.1 200 OK 日:水曜日、2011年1月12日午前18時40分22秒GMT サーバー: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、1981年11月19日08:52:00 GMT キャッシュコントロール:いいえ-store、no-cache、no-cache、再検証、post-check = 0、pre-check = 0 プラグマ:no-cache キープアライブ:タイムアウト= 5、最大= 100 接続:キープアライブ 転送 - エンコード: Content-Typeのチャンク:text/htmlの

を[メッセージの本文]

HTTP/1.1 302見つかり 日:水曜日、2011年1月12日18時40分22秒GMT サーバー: 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 場所:プロファイル.php コンテンツタイプ:text/html

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

私は同じ問題がありました。 スクリプト: header( 'Location:...'); die();

ヘッダーを送信する前のスクリプトは、POST経由でデータを受信し、データnewがDBに変更された場合に送信されます。 POSTデータが大きく、DBリダイレクトに対する多くの変更がうまくいかないと、POSTデータが少し変更されてDBリダイレクトWORKに変わると、不思議です。 header()の後にflush()を使うと私の問題は解決します。

PHPバージョン5.2.17 のApache/2.2.3(CentOSの)

私の意見では、それが(バッファリングするためにサーバープッシュヘッダのように見え、ユーザにバッファの内容を送信する前に死亡し、それはなぜフラッシュです)助けた。私はこれを試してみました http://ru2.php.net/manual/en/function.flush.php

関連する問題