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