URL 内の特殊文字によりカスタム リダイレクトが失敗する

URL 内の特殊文字によりカスタム リダイレクトが失敗する

エラー ページのカスタム リダイレクトを設定しようとしているドメインがあります。
ファイル.htaccessは次のようになります。

RewriteEngine On
AddDefaultCharset UTF-8
DefaultLanguage en-US
# disable TRACK and TRACE http methods. 'RewriteEngine On' is required!
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD|PUT|DELETE)
RewriteRule .* - [F]
Options All -Indexes
ServerSignature Off
<ifModule mod_headers.c>
        Header unset X-Powered-By
</ifModule>
<Files .htaccess>
order allow,deny
deny from all
</Files>
<IfModule php5_module>
        php_value session.cookie_httponly true
        #php_value session.cookie_secure true
</IfModule>
RewriteCond %{QUERY_STRING} _escaped_fragment_=(.*)
#to block all links to '.gif', '.jpg','.js' and '.css'  files which are not from the domain name 'http://www.example.com/'
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule \.(gif|jpg|css|js)$ - [F]
#to deny requests containing invalid characters
RewriteBase /
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]

# Secure directories by disabling execution of scripts
AddHandler .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI


#Error page handeller
ErrorDocument 400 /htaccessSample/errordocs/error-code.php
ErrorDocument 401 /htaccessSample/errordocs/error-code.php
ErrorDocument 403 /htaccessSample/errordocs/error-code.php
ErrorDocument 404 /htaccessSample/errordocs/error-code.php

URL に次のように入力すると:

  • example.com/aboutUs: すべて正常に動作しています。
  • example.com/xxygsds: URL はカスタム 404 エラー ページにリダイレクトされます。
  • example.com/<>: これにより、403 禁止ページにリダイレクトされます。ただし、リダイレクト先はapache/error/HTTP_FORBIDDEN.html.var上記のカスタム ページではなく、ページです。

質問:
1. なぜこのリダイレクトが発生するのですか?
2. すべての状況でカスタム 403 エラー ページにリダイレクトするにはどうすればよいですか?

答え1

なぜそうなるのかはわかりません。403 ページでも同じ問題が発生しました。特定の 403 ページをリダイレクトする場合は、以下を使用します。

<Files some_thing> 
order Deny,Allow 
Deny from all 
</Files>

答え2

エラー ドキュメントの場所を .htaccess ファイルの先頭に移動してみてください。しばらくあなたの例を見て何が起こっているのか理解しようとしましたが、最終的に、この場合、終了する場所が指示される前に終了するように指示されていることに気付きました。

Apache はディレクティブを順番に読み取り、L の場合は終了します。L は F では暗黙的に存在します。

[F] を使用する場合、[L] が暗黙的に使用されます。つまり、応答がすぐに返され、それ以上のルールは評価されません。 Apache 2.4 のリライト

したがって、Apache は、<> の例の真の一致するケースに到達したときに、その一連の命令に到達しないだけだと思います。その場合、それらの宣言に到達する前に終了したため、ページはデフォルトの Apache 403 エラー ページに送信されます。404 が機能したのは、L 条件 (つまり、最後に実行するもの) を含むルールがまったくトリガーされず、htaccess ルールの一番下に到達したためです。

私は習慣的に、php ini の調整などの他のコアな部分とともに、常にデフォルトのエラー ページをディレクティブの先頭に配置するため、このような状況に遭遇したことはありません。

書き直したものは一番下にあります。

目標は、Apache に伝えたいことはすべて、書き換えの L ケースに到達するまで、または htacess/config ルールの終了までに Apache に伝えられることです。htaccess でなければ、Apache はサイトのサービスを開始したときにすべてのルールを認識していたでしょうが、htacess の場合は、ルールを読み取って、ファイルに指示されたことを実行するだけだと思います。

私はこれが正しいと信じていますが、100% 確信しているわけではありません。なぜなら、私は常に、上に置くべきものを上に置いてきたため、あなたのケースを引き起こしたことがないからです。重要なのは、L (Last) が本当に Last を意味することを理解し、さらに F が L を意味することも知ることです。

一般的に、Apache の設定を扱うときは整理しておくと役に立ちます。

# top generics etc
#Error page handler
ErrorDocument 400 /htaccessSample/errordocs/error-code.php
ErrorDocument 401 /htaccessSample/errordocs/error-code.php
ErrorDocument 403 /htaccessSample/errordocs/error-code.php
ErrorDocument 404 /htaccessSample/errordocs/error-code.php

AddDefaultCharset UTF-8
DefaultLanguage en-US
# Disable Directory Browsing, not related to rewrite
Options All -Indexes

# Secure directories by disabling execution of scripts
AddHandler .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

ServerSignature Off
<ifModule mod_headers.c>
        Header unset X-Powered-By
</ifModule>

<IfModule php5_module>
        php_value session.cookie_httponly true
        #php_value session.cookie_secure true
</IfModule>

<Files .htaccess>
order allow,deny
deny from all
</Files>

## NOW do the set of rewrite rules, everything that apache needs to 
## know has been told to it by this point
RewriteEngine On
# disable TRACK and TRACE http methods. 'RewriteEngine On' is required!
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD|PUT|DELETE)
RewriteRule .* - [F]

RewriteCond %{QUERY_STRING} _escaped_fragment_=(.*)
#to block all links to '.gif', '.jpg','.js' and '.css'  files which are not from the domain name 'http://www.example.com/'
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule \.(gif|jpg|css|js)$ - [F]
#to deny requests containing invalid characters
RewriteBase /
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]

.htaccess ファイルの最後には必ず改行/改行を追加してください。あなたのバージョンは非常にランダムで無秩序です。これが、私の意見では問題の実際の原因です。ルールを明確かつ一貫して順序付けることに慣れるだけで (つまり、書き換えが他のルールと混ざらないようにする)、Apache 全般の操作がずっと簡単になります。

関連情報