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