应用2个重写时,追加到URL的查询字符串

时间:2014-08-05 09:54:51

标签: apache .htaccess mod-rewrite

我正在将一个网站从经典的asp重写为php。并非所有新文件名都匹配,所以我不能简单地将.asp重写为.php。 php网站将使用更易读的URL。我遇到以下情况的问题:

旧页面

old-profile.asp?company = ABC + Limited

需要重定向到

/简档/ ABC +有限公司

以下的rewritecond / rewriterule在应用唯一规则时效果很好:

RewriteCond %{QUERY_STRING}     ^company=([^/]+)$    [NC]
RewriteRule ^old-profile\.asp$ /profiles/%1? [R=301,L]

所以,如果我输入/old-profile.asp?company=ABC+Limited,结果是/ profiles / ABC + Limited

但是,稍后在.htaccess文件中我需要使用以下重写规则:

RewriteRule ^profiles/([^/]+)$ /new-profile.php?company=$1

这也适用于新网站上的网页,即网址/个人资料/ ABC +有限公司将在/new-profile.php?company=ABC+Limited

显示页面

这一切听起来不错,但问题是这2条规则不能相互配合使用。问题是以下URL的结果:

/old-profile.asp?company=ABC+Limited

是:

/简档/ ABC +限量?公司= ABC +有限公司

我不想在这个新网址的末尾使用?company + ABC + Limited。在第一次重写我添加了尾随?如果我注释掉第二条规则,这条规则就行了,但是当应用这两条规则时,会出现查询字符串。

非常感谢您的任何帮助!

更新在@anubhava和@ Samurai8的帮助下,我发现了这个问题的原因。旧网站强制www。在URL和新站点的开头强制没有www。在URL的开头。

www。没有www。规则是我的htaccess文件中的所有其他规则之后,并导致此问题。我把它移到了文件的开头,一切正常。

1 个答案:

答案 0 :(得分:1)

保持你的.htaccess像这样:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} ^company=([^&]+)    [NC]
RewriteRule ^old-profile\.asp$ /profiles/%1? [R=301,L,NE,NC]

RewriteRule ^profiles/([^/]+)/?$ new-profile.php?company=$1 [L,QSA]

然后确保在新浏览器中测试它以避免旧的浏览器缓存。