私のサイトの1つでは、一部のスクリプトが開始ページからすべてのURLをraw URLとしてフェッチし、URLに#
が含まれているため、404が返されます。通常のブラウザはその部分をサーバーに送信しませんが、これらのスクリプトは送信します。
これは、典型的なリクエストURLの例です。
/2014/how-to-manage-wordpress-multisite-imports-with-wp-cli/#comments
#
はURLエンコードされていません。
私は次の両方の方法を試しました:
RedirectMatch 301 \#comments /
そして
RewriteRule #(.+)$ /? [L,R=301]
両方とも成功しなかった場合、#
がコメントを開始するため、ルールはこれらのリクエストをキャッチしません。リファラーとユーザーエージェントのフィールドは空です。
私は何をすべきか?
mod_rewriteドキュメント から、書き換えルールにハッシュがある場合、NE
(エスケープなし)フラグを使用する必要があります。
RewriteRule #(.+)$ /? [L,R=301,NE]
NE
フラグはターゲットURLにのみ適用でき、書き換えパターンには適用できないとコメントしました。その場合、別のアプローチは#
記号をエスケープすることです。 mod_rewriteは\x
スタイルのエスケープシーケンスをサポート 。 #
のエスケープシーケンスは\x23
になります。したがって、書き換えルールは次のようになります。
RewriteRule \x23.+$ / [L,R=301]
ソリューションをテストする場合は、コマンドラインでtelnet
を使用してテストできます。コマンドラインtelnet example.com 80
を使用して、Webサーバーへのソケットを開きます。次に、次のような簡単なリクエストを作成します。
GET /#test HTTP/1.0
Host: example.com
余分な新しい行が続きます。