apache-重写的URL重定向错误

apache-重写的URL重定向错误,apache,redirect,url-rewriting,conditional-statements,Apache,Redirect,Url Rewriting,Conditional Statements,我在重定向/重写规则方面遇到问题。 这是我的htaccess文件。 上下文 我想在已经在线的网站上使用重写的url 我想要的是 当有人请求/main.php(旧URL)时,我希望他在/en/(新URL)上重定向,然后apache向他发送main.php?lang=en的结果(由于第7行的重写规则)。另外,我不希望用户看到/main.phpURL,这就是为什么我没有使用重写规则而不是重定向。(见下文) 实际发生的是 当我询问/main.php页面时 apache将我的浏览器重定向到/en/ 当它收

我在重定向/重写规则方面遇到问题。
这是我的htaccess文件。

上下文 我想在已经在线的网站上使用重写的url

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

实际发生的是
  • 当我询问
    /main.php
    页面时
  • apache将我的浏览器重定向到
    /en/
  • 当它收到我的
    /en/
    请求时,它会将URl重写为
    /main.php?lang=en
    (这是预期的行为)
  • 然后apache可以停在那里处理
    /main.php?lang=en
    请求,但是不行,它将URL拆分为
    /main.php
    args=lang=en
    ,并尝试重写和重定向它拥有的新URL(即
    /main.php
  • 当它找到“
    redirect/main.php/en/
    ”行时,它应用它,并用
    /en/
    替换
    /main.php
  • 然后它再次收集url,给出
    /en/?lang=en
  • 它会将我的浏览器重定向到错误的URL
  • 以下是错误日志,您可以按照我刚才给出的解释进行操作(我建议您下载并使用notepad++或任何不自动换行的软件打开):。

    解决办法是什么 Apache只需应用重定向指令一次

    我尝试的解决方案1:使用“如果” 我想我可以尝试将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>
    
    但是,当apache获得
    /en/
    请求并检查
    条件时,它会给出0(这是预期的行为),但是当apache将
    /en/
    重写到
    /main.php?lang=en
    并尝试应用重写规则和重定向指令时,
    %{request\u URI}
    会发生变化,当apache检查条件
    时,它给出1,
    /main.php
    /en/
    替换,给出
    /en/?lang=en
    再次失败。

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

    <If "%{IS_SUBREQ} != 'true'">
    Redirect 301 /main.php  /en/
    </If>
    
    
    重定向301/main.php/en/
    
    但事实上,即使在URL拆分之后,
    IS_SUBREQ
    也不会变为false,并且表达式的求值(当它检查if条件时)始终为1。因此,此解决方案是失败的

    这就是为什么我在这里发布一个问题。
    感谢您阅读这么长的帖子。

    事实上,我的问题是隐藏了另一个,真正的问题是这里的循环问题,但由于args,循环在第一次(但太多)发出时停止。我不得不搜索“重写规则重定向循环”,我在这里很快找到了答案:。
    要将此解决方案应用于我的问题,我必须使用rewrite_mod进行301重定向,并设置一个
    RewriteCond%{ENV:REDIRECT_STATUS}!200
    在上面。问题是,我还是不知道这是怎么回事。是的,但我不知道为什么。当/en/URL被重写时,为什么重定向_状态变为200?但我想这不是问这个问题的地方。

    事实上,我的问题是隐藏了另一个问题,真正的问题是这里的循环问题,但由于args,循环在第一次(但太多)发出时停止。我不得不搜索“重写规则重定向循环”,我在这里很快找到了答案:。 要将此解决方案应用于我的问题,我必须使用rewrite_mod进行301重定向,并设置一个
    RewriteCond%{ENV:REDIRECT_STATUS}!200
    在上面。问题是,我还是不知道这是怎么回事。是的,但我不知道为什么。当/en/URL被重写时,为什么重定向_状态变为200?但我想这不是问这个问题的地方

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