Apache HTTPD 2.4.x: URL/URI に特定の文字が含まれている場合に、ユーザーをカスタム エラー ページに「誘導」するにはどうすればよいですか?

Apache HTTPD 2.4.x: URL/URI に特定の文字が含まれている場合に、ユーザーをカスタム エラー ページに「誘導」するにはどうすればよいですか?

Apache 構成で、ユーザーをカスタム エラー ページに「書き換える」ようにしていますが、うまくいきません。http://localhost/index.html/ddgdg%:sdsdfsブラウザーに入力しても、エラー ページが表示されませんでした。

ブラウザに URL を直接入力すると、カスタム エラー ページを表示できます ( http://localhost/my-error.html)。

何が間違っているのか、何かアイデアはありますか?


私の完全なhttpd.conf:httpd.confへのリンク


デフォルトのhttpd.confへの変更(mod_rewrite.so の LoadModule のコメントを外す必要もありました)

RewriteEngine On
LogLevel alert rewrite:info
#if invalid characters are present in the URI, display 404 page
RewriteCond %{REQUEST_URI} ^\/.+[:%].+  
RewriteRule "^/$" "http://%{SERVER_NAME}/my-error.html" [L,R=301]

カスタムエラーページの内容

$ cat /Library/WebServer/Documents/my-error.html 
<html><body><h1>404 error here</h1></body></html>

Apache バージョン

$ apachectl -v
Server version: Apache/2.4.34 (Unix)
Server built:   Feb 22 2019 20:20:11

編集1:現在はmacOS Mojaveを実行していますが、しばらくするとUbuntu VMをセットアップする予定です。

答え1

ここではいくつかの異なる問題が発生しています...

http://localhost/index.html/ddgdg%:sdsdfs

実際にどのような反応を得ているかは述べていません。起きていませんただし、この URL は、(16 進数でエンコードされたオクテットが先行していない) 迷子のため%、完全に無効であり、Apache は で応答すると予想されます400 Bad Request。これをオーバーライドする唯一の方法は、要求された URL をチェックして応答をカスタマイズするカスタム 400 エラー ドキュメントを作成することです。例:

ErrorDocument 400 /my-error.html

問題がなければ、%mod_rewrite を使用してこのリクエストをキャッチし、それに応じてリダイレクトできるはずです。ただし、 ではRewriteRule空の URL パス (つまり"^/$") がチェックされていますが、例で要求された URL は空とはほど遠い (つまり/index.html/ddgdg%:sdsdfs) ため、ディレクティブは例の URL と一致することはありません。URL パス内のどこかにまたは があるかどうかRewriteRuleをチェックしてリダイレクトするには、次のようにします。%:

# Checks for a "%" or ":" in the URL-path
RewriteRule [%:] /my-error.html [L,R=302]

ただし、URLパスが一致しているかどうかはRewriteRule パターン(サーバー変数も同様REQUEST_URI)は既に%デコードされているため、特殊文字が二重にエンコードされているURLにのみ一致します(まれです)。(上記のように、それ以外の場合は%400応答が生成される可能性が高いです。前にmod_rewrite はリクエストを処理できます。

また、なぜカスタム エラー ドキュメント (つまりmy-error.html) に「リダイレクト」して直接提供しないのかについても疑問に思います。リダイレクトには、クライアントに 3xx 応答が送信される、エラーの原因となった URL に関する情報が失われる、サーバーへのリクエストが 2 倍になるなど、いくつかの欠点があります。

あなたは出来る内部的に書き換える/my-error.htmlフラグを削除するだけで、リダイレクトする代わりにへのリクエストを に転送Rできます。例:

RewriteRule [%:] /my-error.html [L]

ただし、HTTP ステータスを手動で設定しない限り、my-error.htmlユーザーには200 OK応答が表示されますが、これは望ましくありません。

または、(できれば)カスタム 404(実行しようとしている内容に似たもの)を作成し、代わりにそれをトリガーします。例:

ErrorDocument 404 /my-error.html

RewriteRule [%:] - [R=404]

その後、Apache は「404 Not Found」HTTP 応答ステータスを設定します。

しかし、おそらくここではmod_rewriteを使用する必要はありません。サンプルURLでは、index.htmlURLパスの後のすべて、つまり/ddgdg%:sdsdfs追加のパス名情報(別名 path-info / PATH_INFO)。デフォルトでは、text/html 応答を処理するハンドラーは path-info を許可せず、暗黙的に 404 をトリガーし (%上で説明したように、stray でなかった場合)、カスタムを呼び出しますErrorDocument(定義されている場合)。したがって、RewriteRule最後の例のディレクティブは、Apache がいずれにせよ 404 をトリガーするため ( でこの動作を上書きしない限りAcceptPathInfo)、単純に削除できます。

関連情報