5

データベースの結果が空の場合 (製品ページ)、両方を送信しようとしています。

私が現在使用しているコードは次のとおりです。

    header("Status: 404 Not Found");
    include_once("404.html");
    exit;

最初に試したコードは機能しませんでした:

    header("Status: 404 Not Found");
    header("Location: 404.html");
    exit;

後者のコードでは、どちらかを使用できますが、両方を使用することはできません。つまり、404 ヘッダーを送信して Wireshark に表示されるか、または Location ヘッダーを送信してリダイレクトすることができますが、両方を送信しようとすると、404 のみが送信され、Location ヘッダーはリダイレクトされません。

実行可能な解決策で問題を解決しましたが、なぜこれが起こっているのか知りたいです。

FastCGI を使用する Linux 上の PHP 5.2。

ありがとう。

4

3 に答える 3

6

相互に排他的であるため、両方を送信することはできません。

header()のドキュメントによると:

2番目の特殊なケースは、「Location:」ヘッダーです。このヘッダーをブラウザーに送り返すだけでなく、201または3xxステータスコードがすでに設定されていない限り、REDIRECT(302)ステータスコードをブラウザーに返します。

したがって、両方を送信するのは意味がありません。ブラウザに対して、「そのドキュメントは存在しません。また、ドキュメントは次の場所に移動されました」と言っているはずです。それらは矛盾しています。

あなたが見つけた解決策は「回避策」ではありません-それはそれを行う正しい方法です™</p>

于 2012-05-05T23:00:32.223 に答える
1

404.html がサーバー上に実際に存在するため、後者のコードは機能しません。404 ステータス コードを送信してから既存のページにリダイレクトすると、200 (Found) ステータス コードになります。

于 2012-05-05T22:27:36.610 に答える