apache - 重写的URL被重定向错误

时间:2013-08-18 14:28:11

标签: apache redirect url-rewriting conditional-statements

我遇到了重定向/重写规则的问题 这是我的 htaccess文件http://pastebin.com/KJKFGgiH

上下文

我想在我的网站上使用重写的网址。

我想要的是

当有人要求/main.php(旧网址)时,我希望他在/en/(新网址)上重定向,然后apache会向他发送main.php?lang=en的结果(由于第7行的重写规则。此外,我不希望用户看到/main.php URL,这就是我没有使用重写规则而不是重定向的原因。 (见后)

实际发生的是

  1. 当我要求/main.php页面
  2. apache将浏览器重定向到/en/
  3. 当它收到我的/en/请求时,会将URl重写为/main.php?lang=en(这是预期的行为)
  4. 然后apache可以停在那里并处理/main.php?lang=en请求,但不,它会将URL拆分为/main.phpargs=lang=en,并尝试重写并重定向它具有的新URL (即/main.php
  5. 当它找到“redirect /main.php /en/”行时,它会应用它,并将/main.php替换为/en/
  6. 然后再次收集网址,提供/en/?lang=en
  7. 它将我的浏览器重定向到错误的网址
  8. 这是错误日志,您可以按照我刚才给出的解释(我建议您下载并使用notepad ++或任何没有自动换行的软件打开它):http://pastebin.com/Z9q2pry6
    < BR />

    解决方案是什么

    Apache必须只应用一次重定向指令。

    解决方案我尝试了数字1:使用'if'

    我发现我可以尝试将htaccess修改为:

    RewriteRule    ^([a-z]{2})/$     /main.php?lang=$1    [L,E=no_more_redirect:1]
    
    <If "env('no_more_redirect')   != 1">
    Redirect 301   /main.php        /en/
    </If>
    

    - &GT; 如何运作并解决我的问题:

    1. 当apache收到我的/main.php请求时,它会应用重定向
    2. 收到我的/en/请求后,会将该网址重写为/main.php?=lang=en,并将no_more_redirect设置为1
    3. 当它尝试应用所有规则和重定向指令时,它不再适用“Redirect 301 /main.php /en/”。
    4. 它会处理/main.php?lang=en请求。
    5. YAY!但它不起作用。 X(
    6. 这是我尝试使用此解决方案到达/main.php时得到的错误日志:啊,我不能发布超过2个链接,因为我的声誉不到10,但这里基本上是什么发生

      1. 得到我的/main.php请求
      2. 它将我重定向到/en/
      3. /en/重写为/main.php?lang=en并将no_more_redirect设为1
      4. 但是当它检查条件时,它在给出0时给出1,然后第二次应用重定向。的失败。
      5. 问题是,我真的不知道<if>标签的语法,而且doc(见这里:不能发布超过2个链接:c)不是很清楚。另外,我真的不知道环境变量和服务器变量之间的区别,我已经通过互联网看到了<if %{name_of_variable}<if env('name_of_variable')之类的东西,我不知道哪一个是一个,以及如何使用它们等...

        另外,你必须知道我在每次尝试之间清除浏览器的缓存,否则它会以一种奇怪的方式表现。

        解决方案我尝试了2号:REQUEST_URL

        我尝试使用包含给定网址的%{REQUEST_URI}(请参阅此处:再次发布超过2个链接...)

        <if "%{REQUEST_URI} != '/en/'">
        Redirect 301   /main.php        /en/
        </If>
        

        但是当apache获得/en/请求并检查<if>条件时,它会给出0(这是预期的行为),但是当apache将/en/重写为{时{1}}并尝试应用重写规则和重定向指令,/main.php?lang=en更改,当apache检查条件%{REQUEST_URI}条件时,它给出1,<if>被{{替换1}},给予/main.php再次失败。

        解决方案我尝试过number3:IS_SUBREQ

        在寻找解决方案时,我在这里阅读:(不能发布两个以上的链接:c),如果被处理的请求是子请求,则变量/en//en/?lang=en (为模块创建的请求正常工作)。我想,当apache在IS_SUBREQtrue中拆分/main.php?lang=en时,尝试应用规则和指令,我想,这必须是子请求。所以我尝试了:

        /main.php

        但事实上,即使在URL拆分之后,args=lang=en也永远不会变为假,并且表达式的评估(当它检查if条件时)总是给出1.因此,此解决方案是失败

        这就是我在这里发帖的原因。 感谢您阅读这么长的帖子。

1 个答案:

答案 0 :(得分:1)

事实上,我的问题是隐藏另一个,真正的问题是这里的循环问题,但是由于args循环停止在它的第一个(但是太多)话语。我不得不搜索“重写规则重定向循环”,我在这里很快找到答案:.htaccess redirect loop when Redirect and RewriteRule together。 要将此解决方案应用于我的问题,我必须使用rewrite_mod进行301重定向,并在其上设置RewriteCond %{ENV:REDIRECT_STATUS} !200。问题是,我仍然不知道这是如何工作的。确实如此,但我不知道为什么。当/ en / URL被重写时,为什么REDIRECT_STATUS会达到200?但我想这不是问这个问题的地方。