我有一个拥有动态网址的网站,而且他们目前还没有被美化。我已经重新设计了网站并包含了漂亮的网址,但真正的动态文件夹结构/文件名也发生了变化。
为了更好地解释,当前的动态URL看起来像
http://example.com/liveguide/year.php?year=2017
同一页面的新动态网址是
http://example.com/shows/show-list.php?year=2017
我使用以下内容:
RewriteRule ^shows/(199[5-9]|200[0-9]|20[0-1][0-7])/?$ /shows/show-list.php?year=$1 [L]
启用漂亮的网址,例如
因此,我尝试做的是,如果有人关注原始动态网址的链接,他们就会在新的干净网址上结束。到目前为止,我刚刚得到了
RewriteRule ^liveguide/year.php /shows/show-list.php [R=301,L]
哪个重定向到正确的页面,但您在地址栏中留下了丑陋的URL。我怎么能这样做,以便新的漂亮的URL在地址栏中?
即有人访问
http://example.com/liveguide/year.php?year=2017
他们最终会在地址栏中看到
答案 0 :(得分:1)
您只需要匹配查询字符串,该字符串位于单独的变量中,并用于RewriteCond
,其捕获到%1
,%2
等。像这样:
RewriteCond %{QUERY_STRING} ^year=(\d{4})$
RewriteRule ^liveguide/year\.php$ /shows/%1? [R=301,L]
虽然我们在这里,你真的只需要匹配那些确切的年份吗?如果/shows/1234
也被重写了会不会有意义?可能不是,你可以从你的PHP返回404,所以一个更简单的规则就可以了,就像上面说的任何四个数字一样。它也将在未改变它的情况下适用于未来几年。
RewriteRule ^shows/(\d{4})/?$ /shows/show-list.php?year=$1 [L]
目标通常不是完全匹配你想要的东西,而只是那个,而是确保没有其他东西(网站的其他部分)不匹配。更简单的规则更易于维护和审核。你的脚本必须已经能够处理坏数据,所以只需让它处理详细检查而不必重复它。
希望这有帮助。