0

如果我访问 domain.com,网站会重定向到 domain.com/en,这是预期的。但随后最后一条规则启动并将其抛出一个循环,使我的网址看起来像这样:

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 文件重定向到 /?GET_VARS 而不是 /init.php?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 回答