当源包含“?”时重写规则

当源包含“?”时重写规则

对此我感到很困惑。我有一个旧的 URL:

     http://myserver/blog/archive?openview&type=Category&key=Demo

以及新的 URL

     http://myserver/blog/categories/Demo

我正在尝试为此获取重写规则。我认为应该是:

     ^/blog/archive\?openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]

但这没有任何作用。我尝试了 URL 和规则(将 ? 替换为 /):

     http://myserver/blog/archive/openview&type=Category&key=Demo
     ^/blog/archive/openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]

一切按预期运行。所以我有点困惑如何处理旧 URL 中的匹配?。我发现的所有示例都描述了相反的情况。将“漂亮”的 URL 发送给丑陋的 URL。在我的例子中,“丑陋”的 URL 是过去人们收藏的,我想确保他们能够正确获取新数据

答案1

一点思考(和阅读文档) 之后:

mod_rewrite 匹配仅使用 URL 的位置部分。“?”标记位置的结束和参数(又名 QueryString)的开始。一旦我意识到这一点,它就只是谷歌一下

因此,为了正确转换,您需要重写条件:

RewriteCond %{QUERY_STRING}     ^openview&type=Category&key=(.*)    [NC]
RewriteRule ^/blog/archive$ /blog/categories/%1.html [NC,R=301,L]

奇迹般有效

相关内容