我遇到了重定向/重写规则的问题。
这是我的htaccess 文件: http: //pastebin.com/KJKFGgiH。
语境
我想在我已经在线的网站上使用重写的 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
andargs=lang=en
,并尝试重写和重定向它拥有的新 URL(即/main.php
) - 当它找到 "
redirect /main.php /en/
" 行时,它会应用它,并替换/main.php
为/en/
- 然后它再次收集网址,给出
/en/?lang=en
- 它将我的浏览器重定向到那个错误的 URL
这是错误日志,您可以按照我刚刚给出的解释进行操作(我建议您下载并使用notepad ++或任何没有自动换行符的软件打开它): http: //pastebin.com/Z9q2pry6。
解决方案是什么
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>
->它应该如何工作并解决我的问题:
- 当 apache 收到我的
/main.php
请求时,它会应用重定向 - 当它收到我的
/en/
请求时,它将 url 重写为/main.php?=lang=en
,并设置no_more_redirect
为 1 - 当它尝试应用所有规则和重定向指令时,它不再应用“
Redirect 301 /main.php /en/
”。 - 它处理
/main.php?lang=en
请求。 - 耶!但它不起作用。X(
这是我在尝试/main.php
使用此解决方案时收到的错误日志:啊,我不能发布超过 2 个链接,因为我的声誉少于 10,但基本上是这样:
- 它得到了我的
/main.php
要求 - 它把我重定向到
/en/
- 它重写
/en/
为/main.php?lang=en
AND 设置no_more_redirect
为 1 - 但是当它检查条件时,它应该给出 0 时给出 1,然后第二次应用重定向。失败。
问题是,我真的不知道<if>
标签的语法,而且文档(见这里:不能发布超过 2 个链接:c)不是很清楚。另外,我真的不知道环境变量和服务器变量之间的区别,我在互联网上看到过一些东西,比如<if %{name_of_variable}
and <if env('name_of_variable')
,我不知道哪个是一个,以及如何使用它们等等......
另外,您必须知道我在每次尝试之间都会清除浏览器的缓存,否则它的行为会很奇怪。
我尝试了 2 号解决方案:REQUEST_URL
我尝试使用%{REQUEST_URI}
包含给定 URL(请参阅此处:再次我不能发布超过 2 个链接...)之类的
<if "%{REQUEST_URI} != '/en/'">
Redirect 301 /main.php /en/
</If>
但是发生的情况是,当 apache 获取/en/
请求并检查<if>
条件时,它给出 0(这是预期的行为),但是当 apache 重写/en/
并/main.php?lang=en
尝试应用重写规则和重定向指令时,%{REQUEST_URI}
更改以及 apache 检查条件时<if>
条件,它给出 1,/main.php
并被替换为/en/
,给出/en/?lang=en
。再次失败。
解决方案我试过 number3 : IS_SUBREQ
在寻找解决方案时,我在这里阅读:(不能发布两个以上的链接:c),如果正在处理的请求是子请求(为模块正常工作而创建的请求),则变量IS_SUBREQ
是。true
我想,当 apache 分裂/main.php?lang=en
并尝试应用规则和指令时,我想,这一定是一个子请求/main.php
。args=lang=en
所以我尝试了:
<If "%{IS_SUBREQ} != 'true'">
Redirect 301 /main.php /en/
</If>
但事实上,即使在 URL 拆分之后,IS_SUBREQ
也永远不会为 false,并且表达式的评估(当它检查 if 条件时)总是给出 1。因此,这个解决方案是失败的。
这就是为什么我在这里发布一个问题。感谢您阅读这么长的帖子。