web-dev-qa-db-ja.com

URLの先頭のスラッシュを削除する-Apache

私はすべての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で実行しています。


これに関する助けをいただければ幸いです。

1
user2370460

URLパス内の複数のスラッシュanywhereを減らす最も簡単な方法は、RewriteRulepatternが一致するURLパスがすでにあるという事実を使用することです。 (ファイルシステムにマッピングする前に)Apache自体によって複数のスラッシュが単一のスラッシュに削減されました。

既存の書き換え/リダイレクトの前に、以下を試してください。

RewriteEngine On

RewriteCond %{THE_REQUEST} //+
RewriteRule (.*) $1 [R,L]

条件は、THE_REQUESTサーバー変数(HTTPリクエストのraw最初の行を含み、とにかく変更されない)をチェックして、2つ以上のスラッシュが存在するかどうかを判断します。 URLパス。

キャプチャされた後方参照($1)には、すでに複数のスラッシュが削減されています(上記のとおり)

1
MrWhite