重写规则最后标志不起作用?

php_flag display_errors 1 php_value auto_prepend_file init.php RewriteEngine on RewriteRule ^$ /id/authenticate [R] RewriteRule ^login_openid$ /id/login_openid.php [QSA,L] RewriteRule ^authenticate$ /id/authenticate.php [QSA,L] RewriteRule ^facebook$ /id/facebook.php [QSA,L] RewriteRule ^createfromopenid$ /id/createfromopenid.php [QSA,L] RewriteRule .* - [L,R=403] 

这是我的.htaccess文件。 在serverconfig我只有AllowOVerride all

如果我请求URL http://mydomain.com/id/authenticate我得到一个403错误。 如果我删除了最后一条规则,它就会起作用。 不应该阻止任何进一步的规则发生?

编辑:

我的htaccess文件是在子文件夹“ID”,所以规则的工作。

[L]规则正常工作 – 你只是不知道它如何工作的。

当Apache看到[L]标志和规则匹配(重写发生)时,Apache将进入下一次迭代 ,并将从头开始再次匹配所有规则。 [L]标志表示“ 在本次迭代中不处理任何规则”。

是的, Apache文档不是100%清楚(这意味着它可以改进),但提供了足够的信息最终弄清楚。


Apache会在几种情况下停止重写周期:

  1. 没有规则匹配(不重写);

  2. “现在退出”规则匹配(例如RewriteRule .* - [L] );

  3. 重写发生,但inputURL和最终URL是相同的(发生在“严重”写入规则重写相同的URL到相同的URL的第2到第3迭代。

    例如RewriteRule (.*) /index.php?page=$1 [L]

    • /hello => /index.php?page=hello
    • 在下一次迭代它将重写/index.php => /index.php?page=index.php
    • 并在第三次迭代将是/index.php => /index.php?page=index.php ..现在没有任何意义);
  4. 重写迭代限制已达到(默认值= 10),即如果您进入了无限重写周期(该值由LimitInternalRecursion指令控制)。


有了上面提到的所有信息,我可以说你现在的规则确实按预期工作 。 这意味着你必须改变逻辑并摆脱最后的规则(也许在父亲.htaccess中处理这个时刻..或者以不同的方式处理 – 这取决于你的应用程序是如何构build的,我不想做出狂野的猜测)。

把它放在你cath all规则前面。

 RewriteCond %{ENV:REDIRECT_STATUS} !=200 

问题是,一旦[L]标志被处理,所有的下一个RewriteRules确实被忽略,然而,这个文件被从头再次处理,现在使用新的url。

如果文件已经被redirect,这个神奇的条件将不会处理catch all

PS:如果它不起作用,你可能需要稍微调整一下条件: 200!=200^.^$
显然variables设置为200redirect,而其他页面(错误和东西)将其设置为某个值。 现在,这意味着你要么检查是否is emptyis not emptyis 200还是is not 200 ,这取决于你需要什么。