我最近更改了我的CMS,并希望重写一些网址以匹配新的网址/查询字符串参数格式。
旧网址为:
http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz
新网址应为:
http://www.mysite.com/?s=foo
换句话说,旧格式中有几个查询字符串参数,但我只关心将标记参数重写为 s ,同时保持相同的值。其他参数应该被丢弃。当然,参数的顺序无关紧要。标签是否是唯一参数也无关紧要。
有什么想法吗?
答案 0 :(得分:10)
如果您的服务器支持,您可以尝试使用正则表达式和分组。如果我没有弄错你只需要重写一个参数,我想你可以尝试类似的东西(如果你在mod_rewrite中使用apache):
RewriteCond %{QUERY_STRING} ^.*(\btag\b=(\w+|&\w+;)+) RewriteRule ^(.+) /$1?%1 [L]
编辑:我改进了正则表达式以匹配“tag”,无论它在查询字符串中的位置如何,并保留&
等特殊字符序列。避免与类似参数匹配(即:它与名为“alttag”的参数不匹配)。
编辑#2:另一种选择(特别是如果必须过滤几个参数)是使用外部程序进行重写。此页面:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap(特别是“外部重写程序”部分)包含有用的信息。
答案 1 :(得分:2)
在Apache Web服务器上,将以下规则放入文档根目录中的.htaccess将重写URL,如下所述:
RewriteCond %{QUERY_STRING} .*\btag=([^&]*).*
RewriteRule ^search\.cgi /?s=%1 [R=302]
上面的规则使用302重定向,因此在您测试和调整规则时,您的浏览器不会“记住”重定向规则。完成测试后,将[R]更改为[R = 301]。 301是永久重定向,对SEO更好。
答案 2 :(得分:1)
这是另一个版本,专门针对OP的含义。 @ smhmic的答案接近于此。我只是更喜欢显式的开头或者&符号来找到参数,而不是字边界方法。 (接受的答案过于复杂,并且存在一些问题。)
RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]*)
RewriteRule ^search\.cgi$ /?s=%1 [NC,R=302]
这就是说:
(?: )
请勿将此值作为%号记录
^|&
在查询字符串的开头或符号后面(这就像字边界一样,但专门用于网址)。
tag=
我们正在寻找的参数
( )
将此捕获到%1中
[^&]*
零个或多个字符不是&符号(在&符号处停止或运行到最后)。