使用.htaccess中选定的查询字符串参数重写URL

时间:2010-01-21 17:06:58

标签: apache .htaccess url-rewriting

我最近更改了我的CMS,并希望重写一些网址以匹配新的网址/查询字符串参数格式。

旧网址为:

http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz

新网址应为:

http://www.mysite.com/?s=foo

换句话说,旧格式中有几个查询字符串参数,但我只关心将标记参数重写为 s ,同时保持相同的值。其他参数应该被丢弃。当然,参数的顺序无关紧要。标签是否是唯一参数也无关紧要。

有什么想法吗?

3 个答案:

答案 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中 [^&]*零个或多个字符不是&符号(在&符号处停止或运行到最后)。