The*_*can 27 apache mod-rewrite http url-rewriting
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]
Run Code Online (Sandbox Code Playgroud)
这是我的.htaccess文件.在我刚刚拥有的serverconfig中AllowOVerride all
.
如果我请求URL,http://mydomain.com/id/authenticate
我会收到403错误.如果我删除最后一条规则,它就可以了.[L]
公寓不应该阻止任何进一步的规则发生吗?
编辑:
我的htaccess文件位于子文件夹"id"中,因此规则有效.
Laz*_*One 75
该[L]
规则工作正常-你只是不知道它是如何实际工作的.
当Apache看到[L]
标志和规则匹配(重写发生)时,Apache将进入下一次迭代,并将从顶部再次开始匹配所有规则.该[L]
标志表示" 在此迭代中不处理以下任何规则".
是的,Apache文档并非100%清楚(这意味着它可以改进),但提供了足够的信息来最终弄清楚.
Apache将在几种情况下停止重写周期:
没有匹配的规则(没有重写);
"立即退出"规则匹配(例如RewriteRule .* - [L]
);
重写发生,但输入URL和最终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
..现在没有意义);达到重写迭代限制(默认值= 10) - 如果您输入了无限重写周期(该值由LimitInternalRecursion指令控制).
根据上述所有信息,我可以说 您当前的规则确实按预期工作.这意味着你必须改变逻辑并摆脱最后一条规则(也许在父.htaccess中处理这一时刻......或者以不同方式处理它 - 所有这些都取决于你的应用程序是如何构建的,我不想做出疯狂的猜测).
把它摆在你的cath all
规则面前.
RewriteCond %{ENV:REDIRECT_STATUS} !=200
Run Code Online (Sandbox Code Playgroud)
问题是,一旦处理了[L]标志,确实忽略了所有下一个RewriteRules,但是,文件从begin开始处理,现在使用新的url.
catch all
如果文件已经重定向,这个神奇的条件将不会处理.
PS:如果它不工作,你可能需要调整条件的位:200
,!=200
,^.
,^$
.
显然,变量设置200
为重定向,但其他页面(错误和填充)将其设置为某个值.现在,这意味着你要么如果它检查is empty
,is not empty
,is 200
或者is not 200
,这取决于你所需要的.
归档时间: |
|
查看次数: |
35092 次 |
最近记录: |