我正在将一个网站从经典的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文件中的所有其他规则之后,并导致此问题。我把它移到了文件的开头,一切正常。
答案 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]
然后确保在新浏览器中测试它以避免旧的浏览器缓存。