3

我一直在为测试环境中的客户进行一些 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 等)而异

测试环境:
Windows
IIS7.5
PHP 5.3.6

客户环境:
Linux
Apache
PHP 5.2

谢谢,M。

4

1 回答 1

1

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

在您的规则片段中,您%1RewriteRule. 这引用了上一个中的最后一个()匹配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参考([^&]+)

于 2012-07-17T11:56:02.857 回答