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

时间:2012-07-17 11:29:58

标签: .htaccess mod-rewrite redirect query-string

我在一个在我的环境中工作正常的测试环境中为客户做了一些URL重写但是当我转移到他们的网站时,我会得到不同的结果并且规则失败了。

我是301以下列格式重定向旧版动态网址:

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等...)而异。

测试环境:
Windows
IIS7.5
PHP 5.3.6

客户环境:
Linux
阿帕奇
PHP 5.2

谢谢,M。

1 个答案:

答案 0 :(得分:1)

  

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

在此规则的摘要中,您的%1中有反向引用 RewriteRule 。这引用了之前()中的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 引用([^&]+)