Apache RewriteRule Last[L]标志不起作用?
这是我的.htaccess文件。在服务器配置中,我只有Apache RewriteRule Last[L]标志不起作用?,apache,http,mod-rewrite,url-rewriting,Apache,Http,Mod Rewrite,Url Rewriting,这是我的.htaccess文件。在服务器配置中,我只有AllowOVerride all 如果我请求URLhttp://mydomain.com/id/authenticate我收到一个403错误。如果我删除最后一条规则,它就会起作用。[L]平面不应该阻止任何进一步的规则发生吗 编辑: 我的htaccess文件位于子文件夹“id”中,因此规则可以工作。规则可以正常工作-[L]规则只是不知道它实际上是如何工作的 当Apache看到[L]标志和规则匹配(发生重写)时,Apache将转到下一次迭代,并
AllowOVerride all
如果我请求URLhttp://mydomain.com/id/authenticate
我收到一个403错误。如果我删除最后一条规则,它就会起作用。[L]
平面不应该阻止任何进一步的规则发生吗
编辑:
我的htaccess文件位于子文件夹“id”中,因此规则可以工作。规则可以正常工作-
[L]
规则只是不知道它实际上是如何工作的
当Apache看到[L]
标志和规则匹配(发生重写)时,Apache将转到下一次迭代,并从顶部再次开始匹配所有规则。[L]
标志意味着“不要在此迭代中处理下面的任何规则”
是的,并不是100%清楚这一点(这意味着它可以改进),但它提供了足够的信息来最终解决这个问题
Apache将在以下几种情况下停止重写周期:
重写规则。*-[L]
)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
有了上述所有信息,我可以说,您当前的规则确实按照预期工作。这意味着您必须更改逻辑并删除最后一条规则(可能在parent.htaccess中处理这一时刻……或者以不同的方式处理它——这一切都取决于您的应用程序是如何构建的,我不想胡乱猜测)。将此放在
cath all
规则之前
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]
问题是,一旦处理了[L]标志,所有下一个重写规则实际上都会被忽略,但是,文件会从一开始就被再次处理,现在是新的url
如果文件已被重定向,此神奇条件将不会处理捕获所有文件
附言:
如果它不起作用,您可能需要稍微调整一下条件:200
,=200
,^.
,^$
显然,对于重定向,该变量被设置为200
,但其他页面(错误和内容)也将其设置为某个值。现在,这意味着您可以根据需要检查它是否为空
,不为空
,为200
或不为200
。您的陈述表明,除了最后一条规则之外,所有规则都不匹配是有效的想法,但是如果我删除最后一条规则,它会起作用。
意味着它们确实起作用。此外,您还假设我的htaccess文件位于web根文件夹中,而不是子文件夹中,这与问题的情况和上下文无关。但是我不需要你的帮助,因为你又错了。我刚刚在serverfault上找到了问题的正确答案:结果是L规则在rewriterules匹配时不起作用。@Joe目标URL的-
表示没有重写,这与#3(迭代开始时的URL=迭代结束时的URL)几乎相同。由于URL根本没有更改,Apache将退出该循环。根据您的应用程序/重写逻辑,您可以使用以下规则:#不要对现有文件执行任何操作
RewriteCond%{REQUEST\u FILENAME}-f[OR]
RewriteCond%{REQUEST\u FILENAME}-d
RewriteRule.+-[L]
--而且效果很好。@Joe让我们根据您的规则来举个例子:请求URL是/id/login\u openid
。初始迭代:URL被剥离到目录级别并=login\u openid
。这将符合规则2(第5行)。重写发生,新的URL是/id/login\u openid.php
,重写进入下一次迭代。迭代#2:URL被剥离并=login\u openid.php
。除了最后一个规则,它告诉Apache中止请求(发送403响应)——这就是您当前规则的工作方式。@LazyOne,嗯,上面提到的结束标志如何?@Pacerier是的,它应该完成任务(从描述来看,它正是所需的),但它只在2.3.x版本中可用——我个人还没有处理过它(所有服务器仍然是v2.2甚至更低版本),也不知道它的分布有多广。如果您控制整个服务器(可以安装该版本..或者它已经安装),那么您肯定应该尝试一下。我有一个非常类似的问题,这为我解决了它,在我的.htaccessRewriteCond%{ENV:REDIRECT_STATUS}的末尾使用它作为一个“catch all”=200重写规则。*/index.php[L]
RewriteCond %{ENV:REDIRECT_STATUS} !=200