如何避免.htaccess的循环重定向?

如何避免.htaccess的循环重定向?,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我已经用一组规则设置了.htaccess RewriteEngine on RewriteCond $1 !^(index\.php|images|stylesheets|javascript|robots\.txt) RewriteRule ^Canvas/(.*)/(.*)$ /canvas.php?a=$1&b=$2 [L] RewriteRule ^(.*)$ /index.php/$1 [L] 上述规则被重定向并引发500个内部服务器错误 当我对最后一行进行注释时,所有遵循规

我已经用一组规则设置了.htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php|images|stylesheets|javascript|robots\.txt)
RewriteRule ^Canvas/(.*)/(.*)$ /canvas.php?a=$1&b=$2 [L]
RewriteRule ^(.*)$ /index.php/$1 [L]
上述规则被重定向并引发500个内部服务器错误

当我对最后一行进行注释时,所有遵循规则/canvas/something/something的操作都很正常,但当取消对最后一行的注释时,事情就出了问题

我试着添加条件,比如

RewriteCond %{REQUEST_URI}  !^/canvas.php.*

但这并没有解决问题


如何解决这个问题?

您可以尝试添加一个环境变量来标记您已重定向的事实,并使用
RewriteCond
对此设置陷阱。例如(未经测试):


[L]
不会做您认为它会做的事情:它只会停止“本轮”并用新的URL重新开始重写执行。您可能想试试
[END]


或者,您不能尝试使用跳过标志
[S=number\u of \u rules\u to \u skip]

这里发生了两件事。首先,
/canvas.php
将被重写为
/index.php/canvas.php
。然后
/index.php
本身被重写为
/index.php/index.php/canvas.php
,然后继续循环。您的第二条规则没有条件阻止它盲目地重写与
^(.*)$
匹配的所有内容(即所有内容)。请注意,
RewriteCond
只会影响紧跟其后的
RewriteRule
,因此路由到
/index.php
的规则不会有任何条件。可以添加一些条件来防止循环:

RewriteCond $1 !^(index\.php|canvas\.php|images|stylesheets|javascript|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
重写不是
index.php
canvas.php
、图像、样式表、脚本和robots.txt文件的所有内容。或:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
重写所有不指向现有文件或目录的内容。这也排除了直接访问脚本、样式和robots.txt等内容以及任何其他静态内容

另一种可能是通过将其添加到规则顶部(就在
上的重写引擎下方)来完全防止循环:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
这意味着如果已经有内部重写,则通过传递URI(目标
-
来完全停止重写。重写引擎循环,直到URI停止更改,传递基本上就是这样做的。如果使用apache 2.4,还可以使用
END
rewrite标志来停止重写

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]