web-dev-qa-db-ja.com

mod_rewriteでApacheビルトイン404ページにリダイレクトしますか?

Mod_rewriteを使用して多くのURLでApacheのデフォルト、組み込みの404ページを積極的に提供する方法はありますか?カスタムエラードキュメントではなく、次のようなルール

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----

PHP 404ヘッダーを送信し、mod_rewriteすべてのURLをそこにリダイレクトしますが、mod_rewriteのみ。

存在しないアドレスにリダイレクトするというアイデアがありました。

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf

しかし、それはユーザーにメッセージ"/sflkadsölfkasdfölkasdflökasdfが存在しません"を与えるでしょう。これは少し専門的ではないように見えます。

31
Pekka 웃

RRewriteRuleフラグを使用すると、特定のステータスコードでリダイレクトを強制できます。

これは通常リダイレクトに使用されますが、有効なステータスコードはここで指定できます。ステータスコードがリダイレクト範囲(300〜399)の外にある場合、置換文字列は削除され、Lフラグが使用されているかのように書き換えが停止します。

したがって、この:

RewriteRule ^/?page\.html$ - [R=404]

/page.htmlのデフォルトの404ページを返します。これは正規表現であるため、\.のエスケープと$のアンカーを忘れないでください。

-は無視されます(つまり、「置換文字列は削除されます」)が、ルールを正しい形式に保つために何かが必要です。

47
mercator

これを行う最良の方法は、ステータスコード404で[〜#〜] r [〜#〜]フラグを設定することです。

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]

しかし、これはApache 2以降でのみ利用可能です。

11
Gumbo

私はそれを確認します

RewriteRule ^ - [L,R=404]

または

RewriteRule ^ - [L,redirect=404]

動作しません。 Apacheの公式Webサイトからの説明は次のとおりです。

ただし、ステータスコードがリダイレクト範囲(300〜399)の外にある場合、置換文字列は完全に削除され、Lが使用されているかのように書き換えが停止します。

したがって、最善の解決策は、後で説明するように、404ヘッダーを持つ404.phpファイルにリダイレクトすることです。

5
Max

これは動作するはずです:

RewriteEngine on
RewriteRule ^/page.html /error404.html [L]

ただし、404ヘッダーは表示されません。 [L,R=404]しかし、私はそれが動作することを疑います(リダイレクト専用です)。

PHPでそうするというあなたの考えは機能します。すべての「エラーページ」ページがサーバー側(つまりPHP)である場合、次のコードを使用できます。

<?php
header( 'HTTP/1.0 404 Not Found' );
include 'error404.html';
2
DisgruntledGoat