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

问题描述:

我一直在测试环境中为客户做一些URL重写,在我的环境中工作正常,但是当我移动到他们的时候,我得到不同的结果并且规则失败。301重定向规则在不同的托管环境中给出了不同的结果

我在下面的格式301个重定向遗留的动态网址:

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

使用规则集低于这个作品在我的“心互联网”共享主机正常,但无法对他们的“去爸爸”共同主办(CONFIGS下面)。在Go Daddy环境中,遗留网址被重定向到:

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] 

的 '郎' 的查询字符串取决于不同的用户语言偏好(EN或FR或DE等)

测试环境:
的Windows
IIS7.5
PHP 5.3.6

客户环境:
Linux的
阿帕奇
PHP 5.2

感谢,M.

+0

IIS的重写引擎是不一样的Apache的 – 2012-07-17 11:44:49

+0

嗨乔恩,谢谢,我知道他们是不同的,因此wh我列出了环境。不过,我想知道如何在apache环境中获得相同的行为。 – MonkeeX 2012-07-17 11:52:47

哪里了 'GET' 来了吗?这是一个没有其他代码影响这些规则的准系统页面。

在这个片段中你的规则,你有一个反向引用您的RewriteRule%1。这涉及到最后()比赛在前面RewriteCond,这恰好是(GET|HEAD)

​​

你想围绕切换的2个条件:

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

从而使%1引用([^&]+)

+0

或者尝试使'(GET | HEAD)'作为未引用(所以它不能被%N返回引用):'(?:GET | HEAD)' - 这种方法被认为更安全这里根本不重要) – LazyOne 2012-07-17 12:44:02

+0

非常好,谢谢Jon和Lazy。这现在已经解决了。我认为%1看第一个条件,而不是最后一个匹配。我曾认为这可能是得到的来源,但鉴于我的理解(或缺乏),这似乎并不正确。再次感谢。 – MonkeeX 2012-07-17 17:12:44