3

URL で間違ったクエリ文字列を使用しているユーザーをカスタム エラー ページにリダイレクトしたいのですが、.htaccess ディレクティブを通じて 404 ステータスも与えます。

ErrorDocument 404 http://www.domain.com/404.php

編集:これは404ではなく302を与えます!!! 「http://www.domain.com」はリダイレクトを引き起こします。ローカル パスだけで 404 が返されます。http://httpd.apache.org/docs/2.0/mod/core.html#errordocument も参照してください。

したがって、クエリ文字列が有効でないかどうかを判断し、有効な場合は次のコマンドを与えるスクリプトをリクエスト受信 index.php に作成しました。

header("HTTP/1.0 404 Not Found");

しかし、これは .htaccess ディレクティブ ErrorDocument を介してリダイレクトされず、訪問者に 404 ステータスを与えるだけです。

使用header("Location: 404.php")すると 302 ステータスになり、使用header("Location: 404.php", true, 404)するとステータスは 404 になりますが、カスタム 404.php ページには移動しません。

今私は使用します

header ("Location: ", true, 404); 
echo "The URL you use doesn't lead to an existing page, etc.";

しかし、これは当初の計画ではありませんでした... URL で間違ったクエリ文字列を使用するユーザーを、.htaccess ディレクティブ ErrorDocument を介して 404 ステータスを与えながら、カスタム エラー ページにリダイレクトするにはどうすればよいでしょうか? または、これは不可能でしょうか?

4

2 に答える 2

4

私の知る限り、PHP から 404 ページを表示する唯一の方法は、明示的にリダイレクトすることです。その理由は、Apache (または使用している Web サーバー) が、クライアント (実行中の PHP スクリプト) を誘導するリソースを既に正常に見つけているためです。PHP スクリプトがクライアントの要求を解決できない場合、404 ヘッダーの送信とページ自体の表示を処理する必要があります。

リダイレクトすることもできます

header ("HTTP/1.0 404 Not Found");
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php');

または、404 をトリガーする PHP スクリプトに 404 ページを含めることもできます。

header ("HTTP/1.0 404 Not Found");
include ('/path/to/404.php');

編集: 最初の手法 (リダイレクト) を使用し、スクリプトに $_GET を渡して何が問題なのかを判断できるようにする場合は、これを行うことができます。

header ("HTTP/1.0 404 Not Found");
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php?' . http_build_query ($_GET));

404.php ファイルを含めると、 $_GET がすでに利用可能になります

于 2012-08-14T06:38:16.680 に答える
1

カスタム404ページを表示し、ヘッダーの更新を使用してステータス404を取得するための代替ソリューション:

header("refresh:0;url=/404.php",TRUE,404);

ただし、これは標準の動作ではありません。これは、404ページを不正なURL(www.domain.com/index.php?q=badrequestなど)の下に表示するのではなく、実際にユーザーをwww.domain.com/404.phpにリダイレクトしているためです。 Apache ErrorDocumentは、元のURLがまだ404応答を返したため、エンジンスパイダーを検索することが重要かどうかはわかりませんが...

また、Gordonの回答コメントに記載されているhtaccess 404リダイレクトについて知りたい人は、次のように使用します。

RewriteRule ^(match conditions)$ - [R=404,NC,L]
于 2012-08-14T18:42:10.283 に答える