2

PHPで別のページにリダイレクトする標準的な方法(私が知る限り)は次のとおりです。

header("Location: URL");
exit();

しかし、ページの一部がレンダリングされた後にリダイレクトする必要があるとしましょう。私は ASP.NET の使用に慣れており、どこでも好きな場所でこれを行うことができました

Response.Redirect("URL");

しかし、PHPで同等のことを行う方法がわかりません。出来ますか?もしそうなら、どのように、そうでなければ、なぜですか?

4

6 に答える 6

2

ヘッダー機能を使用することはできません。その目的はヘッダーを送信することであり(ユーザーをリダイレクトするだけでなく)、出力が開始されたときに遅すぎるためこれを行うことはできません

簡単な解決策の 1 つは、これに JavaScript を使用することですが、これは「エレガントな」解決策ではありません。また、訪問者が JavaScript を無効にしている場合や、JavaScript コードの上記のエラーが原因で問題が発生した場合に機能しないことは言うまでもありません。

いつでも確実にリダイレクトできるようにする最善の方法は、スクリプトが完了するまで出力をレンダリングしないようにすることだと思います。これを行うには、少なくともテンプレート エンジンを使用して、php コードを html から分離し、コンテンツが最後にユーザーに送信されるようにする必要があります。

出力バッファリングを使用することもできます。これにより、出力が開始される瞬間を遅らせることができるためです (出力バッファのサイズを超えたとき、または自分でフラッシュしたとき。これについてはphp.net/ob_startを参照してください。次のようなことを行う必要があります)。これ: http://codepad.org/AomD4Sok )

PS:リダイレクト後の die/exit を忘れないでください。

于 2012-06-14T14:39:55.397 に答える
1

理想的には、ヘッダーが送信される前にのみリダイレクトが発生するように、コードを再配置する必要があります。ただし、できない場合は、すべてをバッファに保存し、すべてが完了したらブラウザに送信できます。

ob_end_clean();
header('Location: xx');

ob_start();ただし、スクリプトの先頭に配置する必要がある場合があります。

私はJSの解決策に反対するつもりでしたが、この時代にはそれでうまくいくと思います。

于 2012-06-14T14:35:19.190 に答える
1

URLを変数に保存し、最後にリダイレクトすることをお勧めします。このプロセス中は、コンテンツも送信しないでください。代わりに、コンテンツを保存して最後にすべて送信し、「ヘッダー送信」エラーが発生しないようにします。

$url = '/posts';

// code code code
// oops, we want to redirect elsewhere now
$url = '/tags';

// end of script, send *content* and headers
header("Location: $url");

明らかに、ここには大きな改善の余地がありますが、あなたはその考えを理解しています。リクエストが完了するまで、ヘッダーやコンテンツを送信しないでください。

于 2012-06-14T14:35:52.670 に答える
0

ページの先頭に追加します:ob_start(); バッファリングを開始するか、構成ファイルでバッファリングを有効にします。次に、出力するすべてのものが、スクリプトが終了するか、バッファーをフラッシュするのを「待機」します:ob_flush。

それで:

ob_start();
//something
ob_end_clean(); //erase output
header('Location: ');
于 2012-06-14T14:35:09.850 に答える
0

使い慣れたものと同様のセマンティクスで独自のクラスを実装Responseし、そのインスタンスを使用して出力を蓄積し、必要な場所に何でも出力するという PHP のデフォルトの動作に依存するのではなく、応答として送信することができます。このようにして、応答 (およびヘッダー) をいつ送信するかを制御できます。これは、多くの PHP フレームワークが実際に行っていることです。生の PHP を使用するのではなく、周りを見渡して、自分に合ったものを選択できるかどうかを確認してください。

于 2012-06-14T14:38:45.030 に答える