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
页面时/en/
/en/
请求时,它会将URl重写为/main.php?lang=en
(这是预期的行为)/main.php?lang=en
请求,但是不行,它将URL拆分为/main.php
和args=lang=en
,并尝试重写和重定向它拥有的新URL(即/main.php
)redirect/main.php/en/
”行时,它应用它,并用/en/
替换/main.php
/en/?lang=en
解决办法是什么 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 totrue
,如果所处理的请求是子请求(为模块正常工作而创建的请求)。我想,当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>