1

所以我有两个规则。每条规则都完全按照它自己的方式执行它应该做的事情.htaccess,但是当两个规则都存在时,它们开始相互冲突。

RewriteCond %{REQUEST_URI} ^(.*)\.html$
RewriteRule ^(.*)\.html$ index.php?id=$1 [QSA,L]

当数字结束时,上述规则才能正常使用http://domain.com/12.html12注释文件不存在!)index.php .html12.html

RewriteCond %{REQUEST_URI} !^(.*)\.html$
RewriteRule ^(.*)$ /$1\.html [L,R=301]

这适用于检查 URL 是否以.html. 如果它没有以 结束.html,它会将其重定向到 URI + .html(这本身也可以正常工作)。

当我同时拥有两条规则时.htaccess

RewriteCond %{REQUEST_URI} ^(.*)\.html$
RewriteRule ^(.*)\.html$ index.php?id=$1 [QSA,L]

RewriteCond %{REQUEST_URI} !^(.*)\.html$
RewriteRule ^(.*)$ /$1\.html [L,R=301]

然后有一个循环导致重定向循环。

有人可以指出我哪里出错了吗?

4

1 回答 1

1

因此,第一条规则重写http://domain.com/12.htmlhttp://domain.com/index.php?id=12. 然后事情开始出错;第二条规则将其重写为http://domain.com/index.php.html?id=12,但那时我认为您会发现第一条规则再次生效,将其重写为类似 的东西http://domain.com/index.php?id=index.php,第二条规则将其重写为http://domain.com/index.php.html?id=index.php。在这一点上,我认为规则最终会争夺 URL。

最简单的解决方案可能是调整第二个重写规则,不要重写已经包含扩展名的页面,即使用[^.]*而不是.*.

于 2012-10-22T10:50:13.613 回答