web-dev-qa-db-ja.com

.htaccessで#を使用してURLをリダイレクトする

私のサイトの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]

両方とも成功しなかった場合、#がコメントを開始するため、ルールはこれらのリクエストをキャッチしません。リファラーとユーザーエージェントのフィールドは空です。

私は何をすべきか?

5
fuxia

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

余分な新しい行が続きます。

4