.htaccess mod_rewrite:将查询字符串重写为路径

时间:2009-08-02 01:56:41

标签: .htaccess mod-rewrite

我怎样才能使用重写来改变:

/?tag = foo

要:

/标签/富

我试过了:

RewriteCond %{QUERY_STRING} ^tag=(.+)$
RewriteRule ^(.*)$ http://www.example.com/tag/$1 [L]

但它不起作用。

3 个答案:

答案 0 :(得分:6)

尝试以下方法:

RewriteCond %{QUERY_STRING} ^tag=(.+)$
RewriteRule ^(.*)$ http://www.example.com/tag/%1 [L]

通常,重写用于实现相反的效果。你确定你真的不想做以下事吗?

RewriteRule ^tag/(.+)$ index.php?tag=$1 [L]

答案 1 :(得分:5)

为避免递归,您应该检查request line,因为%{QUERY_STRING}中的查询字符串可能已被其他规则更改:

RewriteCond %{THE_REQUEST} ^GET\ /\?(([^&\s]*&)*)tag=([^&\s]+)&?([^\s]*)
RewriteRule ^(.*)$ /tag/%3?%1%4 [L,R=301]

然后你可以在内部重写那些请求而不会发生冲突:

RewriteRule ^tag/(.*) index.php?tag=$1 [L]

答案 2 :(得分:0)

我试图从这样的网址转换:

http://java.scandilabs.com/faq?key=Contents_of__gitigno

到这样的网址:

http://scandilabs.com/technology/knowledge/Contents_of__gitigno

安德鲁上面的回复对我有用,最后添加了一个问号来丢弃原始查询字符串:

RewriteCond %{HTTP_HOST} ^java
RewriteCond %{QUERY_STRING} ^key=(.+)$    
RewriteRule ^(.*)$ http://scandilabs.com/technology/knowledge/%1? [R=301,L]

请注意,如果您使用的是2.4或更高版本的apache,则可以使用QSD标志而不是问号。