-2

ここにあるコードに基づく:複数の末尾のスラッシュを削除する mod_rewrite

私は次のhtaccessを持っています

Options +FollowSymLinks
DirectorySlash Off
RewriteEngine on
RewriteOptions inherit
RewriteBase /

#
# remove multiple slashes from url
#
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]

#
# Remove multiple slashes anywhere in URL
#
RewriteCond %{THE_REQUEST} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

しかし、G-Bot がこの URL をクロールしたことがわかりました: http://www.example.com/aaa/bbb/////////bbb-ccc/bbb-ddd.htm. (aaa、bbb、ccc、ddd は URL のキーワードであり、文字通りに解釈しないでください - URL のパターンを示します)

上記の URL をライブ サーバーでテストしたところ、スラッシュの削除が機能しないことがわかりました。

誰でも既存のコードにヒントや改善を提供できますか? ありがとうございました

編集1
@Sylwesterは次のコードを提供しました

# if match set environment variable and start over
RewriteRule ^(.*?)//+(.*)$ $1/$2 [E=REDIR:1,N]

# if done at least one. redirect with 301
RewriteCond %{ENV:REDIR} 1
RewriteRule ^/(.*) /$1 [R=301,L]

どちらも機能していません。URL 内に ////// がまだ表示されます。
他のルールの影響を受けないように、この一連のルールを htaccess ファイルの一番上、" RewriteBase /" のすぐ下に配置しましたが、まだ... 何もありません。
他の提案はありますか?

4

1 に答える 1

3

apache は実際に冗長なスラッシュを削除してくれるので、ディレクトリごとおよび .htaccess は注意が必要です。例えば。//+ に一致するものはもうないので、%{REQUEST_URI} をチェックします。これは、元の URI を持っているためですが、書き換えルールは何かに一致する必要があります。

# NB: Only works for per directory and .htaccess
# Needs "AllowOverride All" in global config for .htaccess 
RewriteEngine On
RewriteBase "/"

Options +FollowSymlinks
# Check if the REQUEST_URI has redundant slashes
# and redirect to self if it has (which apache has cleaned up already)
RewriteCond %{REQUEST_URI} //+
RewriteRule ^(.*) $1 [R=301,L]   

グローバル構成を追加できる場合は、代わりに仮想ホストでこれを使用することをお勧めします。

RewriteEngine On
# if match set environment variable and start over
RewriteRule ^(.*?)//+(.*)$ $1/$2 [E=REDIR:1,N]

# if done at least one. redirect with 301
RewriteCond %{ENV:REDIR} 1
RewriteRule ^/(.*) /$1 [R=301,L]
于 2013-06-18T19:37:47.080 に答える