私はすべてのURLから末尾のスラッシュを削除しようとしています。たとえば、次のURLをリダイレクトしたいとします。
_http://my-site-url.com///test
_-> _http://my-site-url.com/test
_
_http://my-site-url.com//test
_-> _http://my-site-url.com/test
_
_http://my-site-url.com/test
_-> _http://my-site-url.com/test
_
次のRedirectMatchルールを使用してみました。RedirectMatch 301 ^//+(.*)$ http://my-site-url.com/$1
しかし、これは何もしません。ページはリダイレクトされず、URL(複数のスラッシュ付き)がサーバーログに表示されます。
また、次のRewriteRuleルールを使用してみました。RewriteRule ^//+(.*)$ http://my-site-url.com/$1 [R=301,L]
しかし、これも何もしません。
奇妙なことに、ルールは次のとおりです。RedirectMatch 301 ^//*(.*)$ http://my-site-url.com/$1
は期待どおりに機能します。つまり、正しいURLであっても、all urlをリダイレクトします。しかし、式を^//+(.*)$
に変更するとすぐに、何に対しても一致しなくなります。
_httpd -v
_の出力は次のとおりです。
_Server version: Apache/2.4.37 (centos)
Server built: Oct 7 2019 21:42:02
_
そして、私はCentOS8で実行しています。
これに関する助けをいただければ幸いです。
URLパス内の複数のスラッシュanywhereを減らす最も簡単な方法は、RewriteRule
patternが一致するURLパスがすでにあるという事実を使用することです。 (ファイルシステムにマッピングする前に)Apache自体によって複数のスラッシュが単一のスラッシュに削減されました。
既存の書き換え/リダイレクトの前に、以下を試してください。
RewriteEngine On
RewriteCond %{THE_REQUEST} //+
RewriteRule (.*) $1 [R,L]
条件は、THE_REQUEST
サーバー変数(HTTPリクエストのraw最初の行を含み、とにかく変更されない)をチェックして、2つ以上のスラッシュが存在するかどうかを判断します。 URLパス。
キャプチャされた後方参照($1
)には、すでに複数のスラッシュが削減されています(上記のとおり)