301 重定向规则在不同的托管环境下给出不同的结果

Posted

技术标签:

【中文标题】301 重定向规则在不同的托管环境下给出不同的结果【英文标题】:301 Redirect Rule gives different results on different hosting environment 【发布时间】:2012-07-16 07:38:18 【问题描述】:

我一直在测试环境中为客户进行一些 URL 重写,在我的环境中运行良好,但是当我转移到他们的环境时,我得到不同的结果并且规则失败。

我正在 301 重定向旧版动态 URL,格式如下:

http://www.companyname.com/page.php?pagename=AboutCompany&lang=EN
to
http://www.companyname.com/EN/about-company/

使用下面的规则集在我的“Heart Internet”共享主机上运行良好,但在他们的“Go Daddy”共享主机上失败(下面的配置)。在 Go Daddy 环境中,旧版 URL 被重定向到:

http://www.companyname.com/GET/about-company/
instead of
http://www.companyname.com/EN/about-company/

“GET”从哪里来?这是一个准系统页面,没有其他代码影响这些规则。

RewriteCond %QUERY_STRING pagename=AboutCompany
RewriteCond %QUERY_STRING lang=([^&]+)
RewriteCond %THE_REQUEST ^(GET|HEAD)\ /page.php
RewriteRule ^page.php$ /%1/about-company/? [R=301,L]

RewriteRule ^([A-Za-z]+)/about-company$ page.php?pagename=AboutCompany&lang=$1 [NC,L]
RewriteRule ^([A-Za-z]+)/about-company/$ page.php?pagename=AboutCompany&lang=$1 [NC,L]

“lang”查询字符串因用户语言偏好(EN 或 FR 或 DE 等)而异

测试环境: 视窗 IIS7.5 PHP 5.3.6

客户环境: Linux 阿帕奇 PHP 5.2

谢谢,M。

【问题讨论】:

IIS 的重写引擎和 apache 的不一样 嗨 Jon,谢谢,我知道它们是不同的,因此我列出了环境。不过,我想知道如何在 apache 环境中获得相同的行为。 【参考方案1】:

“GET”从哪里来?这是一个准系统页面,没有其他代码影响这些规则。

在您的规则的这个 sn-p 中,您的 RewriteRule 中有一个反向引用 %1。这引用了前一个RewriteCond 中的最后一个() 匹配,恰好是(GET|HEAD)

RewriteCond %QUERY_STRING lang=([^&]+)
RewriteCond %THE_REQUEST ^(GET|HEAD)\ /page.php
RewriteRule ^page.php$ /%1/about-company/? [R=301,L]

您想切换这两个条件:

RewriteCond %THE_REQUEST ^(GET|HEAD)\ /page.php
RewriteCond %QUERY_STRING lang=([^&]+)
RewriteRule ^page.php$ /%1/about-company/? [R=301,L]

所以 %1 引用 ([^&]+)

【讨论】:

或者尝试将 (GET|HEAD) 设为未引用(因此它不能被 %N 反向引用):(?:GET|HEAD) - 这种方法被认为更安全(因为这里的顺序或条件无关紧要完全) 太棒了,感谢 Jon 和 Lazy。现在已解决。我认为 %1 查看第一个条件而不是最后一个匹配项。我曾认为这可能是 get 的来源,但考虑到我的理解(或缺乏),这似乎不正确。再次感谢。

以上是关于301 重定向规则在不同的托管环境下给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 301 重定向会导致重定向到错误的 url?

百度网站改版301重定向记录 提示 跳转关系与规则不符

301 将国家域名的***域名重定向到另一个域名

301 重定向 - 根文件夹和子文件夹的不同位置

Apache环境中重定向301的配置

为 301 重定向配置 Amazon 重定向规则