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

Apache 在.htaccess中使用选定的查询字符串参数重写URL,apache,.htaccess,url-rewriting,Apache,.htaccess,Url Rewriting,我最近更改了我的CMS,并希望重写一些URL以匹配新的URL/查询字符串参数格式 旧URL为: http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz 新URL应为: http://www.mysite.com/?s=foo 换句话说,旧格式中有几个查询字符串参数,但我只想将标记参数重写为s,同时保持相同的值。其他参数应丢弃。当然,参数的顺序并不重要。标签是否是唯一的参数也不重要 有什么想法吗?如果您的服务

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

旧URL为:

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

http://www.mysite.com/?s=foo
换句话说,旧格式中有几个查询字符串参数,但我只想将标记参数重写为s,同时保持相同的值。其他参数应丢弃。当然,参数的顺序并不重要。标签是否是唯一的参数也不重要


有什么想法吗?

如果您的服务器支持,您可以尝试使用正则表达式和分组。如果我没有弄错的话,您只需要重写一个参数,我想您可以尝试类似的方法(如果您使用带有mod_rewrite的apache):

RewriteCond%{QUERY_STRING}^.*(\btag\b=(\w+|和\w+)+) 重写规则^(+)/$1?%1[L] 编辑:我稍微改进了正则表达式,使之与“tag”匹配,而不管它在查询字符串中的位置如何,并保留特殊字符序列,如
&此外,它应该避免与类似参数匹配(即:它不会与名为“alttag”的参数匹配)


编辑#2:另一种方法(尤其是当您必须过滤多个参数时)是使用外部程序进行重写。此页面:(特别是“外部重写程序”部分)包含有用的信息。

在Apache Web服务器上,将以下规则放入文档根目录中的.htaccess将按照您的描述重写URL:

RewriteCond %{QUERY_STRING} .*\btag=([^&]*).*
RewriteRule ^search\.cgi /?s=%1 [R=302]

上面的规则使用302重定向,因此在测试和调整重定向规则时,浏览器不会“记住”重定向规则。完成测试后,将[R]更改为[R=301]。301是一个永久的重定向,对搜索引擎优化更好。

这里有另一个版本来明确OP的含义@smhmic的答案接近于此。我只是喜欢显式的开始或符号来查找参数,而不是单词边界方法。(公认的答案过于复杂,存在一些问题。)

这是说:
(?:)
不要将其捕获为%number
^ |&
在querystring的开头或在一个符号后面(这类似于单词边界,但专门用于URL)。
tag=
我们正在寻找的参数。
()
将其捕获到%1中。

[^&]*
零个或多个字符不是与符号(并在与符号处停止或运行到末尾)。

因此重写规则中的%1反映了重写条件中的正则表达式匹配?是,%1用于引用重写条件中的组,虽然$1用于在RewriteRule指令中引用一个组,但我如何设置我的RewriteUrl来映射/search.cgi?。。。部分到/?…另外,如果我想将此配置为重定向而不是重写,会有什么变化?要在[L]上一个规则之后放置R=重定向:即:
RewriteRule%{REQUEST\u URI}%{REQUEST\u URI}?%1[L,R=302]
。您可以在这里找到HTTP状态代码的完整列表:(您必须使用300-307范围内的代码)。通常使用301或302状态代码。这应该使用
s
参数重定向,它将按要求工作。马上返回给您+1这几乎就是我的解决方案,但正则表达式更精确+1.
RewriteCond %{QUERY_STRING} .*\btag=([^&]*).*
RewriteRule ^search\.cgi /?s=%1 [R=302]
RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]*)
RewriteRule ^search\.cgi$ /?s=%1 [NC,R=302]