添加斜杠会导致错误

时间:2011-03-02 16:30:18

标签: .htaccess mod-rewrite expressionengine

这是我的重写代码:

    RewriteEngine On
    RewriteBase "/"
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
    RewriteRule (.*)$ http://www.whatever.com/$1/ [R=301,L]

    RewriteRule ^(.*)$ index.php/$1 [L]

这适用于表达式引擎网站。如果我将这2行删除,该网站工作正常:

    RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
    RewriteRule (.*)$ http://www.whatever.com/$1/ [R=301,L]

我添加的行是为了向任何URL添加尾部斜杠(如果没有),以避免在Google中重复索引。它导致我的日志文件中出现此错误: 请求超出了“由于可能的配置错误导致的10个内部重定向限制”

我认为它没有正确处理RewriteCond并进入无限循环。有没有想过为什么会这样?

3 个答案:

答案 0 :(得分:1)

这是我的ExpressionEngine .htaccess,它删除了斜杠,不确定你是否有偏好,但我认为没有它们会更好。

RewriteEngine on

# get rid of trailing slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php) [NC]
RewriteRule ^(.+)\/$ /$1 [L,R=301]

# no plain index.php either
RewriteRule ^(index\.php)$ / [L,NC,R=301]

# rewrite index.php
RewriteCond $1 !^(images|system|themes|favicon\.ico|robots\.txt|index\.php) [NC]
RewriteRule ^(.*)$ /index.php/$1 [L]

答案 1 :(得分:0)

启用重写日志记录(RewriteLogLevel 3左右应该执行此操作),并且大多数情况下您会看到请求在

之间来回传输
 www.whatever.com/blah
 www.whatever.com/blah/
 www.whatever.com/blah
 www.whatever.com/blah/
 www.whatever.com/blah
 www.whatever.com/blah/
 etc....

答案 2 :(得分:0)

首先,原则是:在任何重写之后,整个规则集从头开始处理。 [L]标志不会阻止这种情况;它控制规则是否是当前运行中的最后一个。

在这种情况下,问题是最后一条规则。它改写了这样的东西:

foo → index.php/foo → index.php/index.php/foo → ...

当您删除这两行时,此规则会附加!-f!-d条件,从而阻止循环。

从行的分组看,您希望将这两个条件附加到以下所有规则。您不能这样做,但您可以将相反的条件附加到将停止处理的规则:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]