0

我已经设置了一个带有一组规则的 .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 %{REQUEST_FILENAME}  !^/canvas.php.*

但它并没有解决问题。

我该如何解决这个问题?

4

3 回答 3

0

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

请参阅结束与最后标志

或者,您不能尝试使用跳过标志[S=number_of_rules_to_skip]

于 2013-06-14T11:33:46.883 回答
0

您也许可以尝试添加一个环境变量来标记您已重定向的事实,并使用RewriteCond. 例如(未经测试):

RewriteEngine on
RewriteCond $1 !^(index\.php|images|stylesheets|javascript|robots\.txt)
RewriteRule ^Canvas/(.*)/(.*)$ /canvas.php?a=$1&b=$2 [E=REWRITEDONE:1,L]

RewriteCond %{ENV:REWRITEDONE} !1
RewriteRule ^(.*)$ /index.php/$1 [L]
于 2013-06-14T11:31:05.457 回答
0

这里发生了两件事。首先,/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.phpcanvas.php、 图像、 样式表、 脚本和 robots.txt 文件的内容。或者:

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

重写指向现有文件或目录的所有内容。这也排除了对脚本和样式、robots.txt 等内容以及任何其他静态内容的直接访问。

另一种可能性是完全防止循环,通过将其添加到规则的顶部(右下方RewriteEngine On

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

这意味着如果已经有内部重写,则通过传递 URI(-目标)完全停止重写。重写引擎循环直到进入的 URI 停止变化,直通本质上就是这样做的。如果你使用的是 apache 2.4,你也可以使用ENDrewrite 标志来停止重写。

于 2013-06-14T12:00:30.680 回答