web-dev-qa-db-ja.com

mod_rewrite:末尾のスラッシュを削除します(1つだけ!)

きれいなURLにはmod_rewrite/.htaccessを使用します。

この条件/ルールを使用して、末尾のスラッシュを排除しています(または、301リダイレクトにより、非末尾スラッシュURLに書き換えます。これは、コンテンツの重複を避けるために行っています。末尾のスラッシュのないURLが好きなためです。より良い):

RewriteCond%{REQUEST_FILENAME}!-f 
 RewriteCond%{REQUEST_FILENAME}!-d 
 RewriteCond%{HTTP_Host}!^ \。localhost $ [NC] 
 RewriteRule ^(。+ )/ $ http://%{HTTP_Host}/$ 1 [R = 301、L]

これまでのところうまくいきます。唯一の欠点:
"multiple-trailing-slash" -URLsnon-trailing-slash-URLsにも転送します。

例:
http://example.tld/foo/bar//////http://example.tld/foo/barに転送します
_http://example.tld/foo/bar/だけをhttp://example.tld/foo/barに転送したい。

それで、実際に1つだけ末尾のスラッシュである場合にのみ、末尾のスラッシュを削除することは可能ですか?

これがやや迷惑な、または奇妙な質問である場合はごめんなさい!

ありがとう。

25
user367217

次のルールは、スラッシュで終わるすべてのURLに一致し、スラッシュを末尾からすべて削除します。

RewriteRule ^(.*)/+$ $1 [R=301,L]

注:現在受け入れられている回答は、httpではなくhttpsでのみ機能しますが、これは両方で機能します。

22
aleemb

書き換えルールを次のように変更します。

RewriteRule ^(.+[^/])/$ http://%{HTTP_Host}/$1 [R=301,L]

英語の場合:文字列の先頭、1つ以上の任意のものに一致します。スラッシュ、スラッシュ、終了には一致しません。

14
Jon
^(.+[^/])/$

つまり前置文字はスラッシュであってはなりません。

4
Sjoerd

URLから末尾のスラッシュを削除するmod-aliasベースのソリューションは次のとおりです。

RedirectMatch ^/(.*?)/$ /$1

Htaccessまたはserver.configファイルで上記のリダイレクトを使用できます。

/ uri /を*/uri **にリダイレクトします。

2
starkeen

GETリクエストから末尾のスラッシュのみを削除する場合は、以下を使用します。

RewriteCond %{REQUEST_METHOD} =GET
RewriteRule ^(.*)/$ /$1 [L,R=301]
0