Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache RewriteRule Last[L]标志不起作用?_Apache_Http_Mod Rewrite_Url Rewriting - Fatal编程技术网

Apache RewriteRule Last[L]标志不起作用?

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将转到下一次迭代,并

这是我的.htaccess文件。在服务器配置中,我只有
AllowOVerride all

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

编辑:


我的htaccess文件位于子文件夹“id”中,因此规则可以工作。

规则可以正常工作-
[L]
规则只是不知道它实际上是如何工作的

当Apache看到
[L]
标志和规则匹配(发生重写)时,Apache将转到下一次迭代,并从顶部再次开始匹配所有规则。
[L]
标志意味着“不要在此迭代中处理下面的任何规则”

是的,并不是100%清楚这一点(这意味着它可以改进),但它提供了足够的信息来最终解决这个问题


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

  • 根本没有匹配的规则(没有发生重写)

  • “立即退出”规则匹配(例如
    重写规则。*-[L]

  • 重写发生,但输入URL和最终URL是相同的(发生在第二到第三次迭代时,编写的“糟糕”规则将相同的URL重写为相同的URL)

    例如
    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)——这是指您输入了无限重写周期(该值由控制)



  • 有了上述所有信息,我可以说,您当前的规则确实按照预期工作。这意味着您必须更改逻辑并删除最后一条规则(可能在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甚至更低版本),也不知道它的分布有多广。如果您控制整个服务器(可以安装该版本..或者它已经安装),那么您肯定应该尝试一下。我有一个非常类似的问题,这为我解决了它,在我的.htaccess
    RewriteCond%{ENV:REDIRECT_STATUS}的末尾使用它作为一个“catch all”=200重写规则。*/index.php[L]
    RewriteCond %{ENV:REDIRECT_STATUS} !=200