0

domain.com にアクセスすると、サイトは domain.com/en にリダイレクトされますが、これは想定どおりです。しかし、最後のルールが開始され、ループにスローされ、URL が次のようになります。

http://domain.com/en/?lang=en&request=&site=basecamp&lang=en&request=&site=basecamp&lang=en&request=&site=basecamp&lang=en&request=&site=basecamp

.htaccess ファイル

Options +FollowSymlinks
RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_URI} !/(content|images|css|js|fonts|pdfs)/
RewriteRule  /([^.]+\.(jpe?g|gif|bmp|png|css|js|eot|svg|ttf|ico|pdf))$ /$1 [NC,R,L]

RewriteCond %{REQUEST_URI} !(content|images|css|js|fonts|pdfs)/.*
RewriteRule !^[a-z]{2}/ /en/ [NC,L,R]

RewriteCond %{REQUEST_URI} !/(init\.php|content|images|css|js|fonts|pdfs)/
RewriteRule ^([a-z]{2})/(.*)$ init.php?lang=$1&request=$2&site=basecamp[L,QSA]

htaccess ファイルが /init.php?GET_VARS ではなく /?GET_VARS にリダイレクトされるのはなぜですか?

そして、どうすればこのループを回避できますか?

4

1 に答える 1

1

先頭と末尾のスラッシュを削除して、最後の条件を変更してみてください。URI を次のように書き換えました。

/init.php

ただし、指定した条件のように末尾のスラッシュがないため、ルールが再度適用されます。次のようになります。

RewriteCond %{REQUEST_URI} !(init\.php|content|images|css|js|fonts|pdfs)

ここで条件の最後に末尾のスラッシュを付けることを主張する理由がわかりません:

#                 with this / here, it will never match init.php --------v
RewriteCond %{REQUEST_URI} !/(init\.php|content|images|css|js|fonts|pdfs)/

しかし、init.php を直接除外するだけで解決できます。

RewriteCond %{REQUEST_URI} !init.php

したがって、明確にするために、条件/ルールの最後のセットは次のようになります。

RewriteCond %{REQUEST_URI} !init.php
RewriteCond %{REQUEST_URI} !/(content|images|css|js|fonts|pdfs)/
RewriteRule ^([a-z]{2})/(.*)$ init.php?lang=$1&request=$2&site=basecamp [L,QSA]

または最悪の場合、これをルールの最初に追加するだけです:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

これにより、あらゆる種類の書き換えエンジンのループが完全に防止されます。

于 2012-09-14T18:28:50.720 に答える