使用 mod_rewrite 重定向查询字符串(反之亦然)

Posted

技术标签:

【中文标题】使用 mod_rewrite 重定向查询字符串(反之亦然)【英文标题】:Redirect query string with mod_rewrite (vice versa) 【发布时间】:2018-09-18 22:48:08 【问题描述】:

假设我有带有查询字符串的 URL,即: /DesignPatterns

使用 mod_rewrite,我如何将它们重定向到: /index.php?book=DesignPatterns

以下是否正确?

 RewriteCond %QUERY_STRING (\w+) 
 RewriteRule ^index.php?book=%1? [L,R=301]

PS:最初的问题:如何将查询字符串变量与 mod_rewrite 匹配? (2010 年 2 月 12 日,Patrick McElhaney,我征求他的同意)

【问题讨论】:

您的 Rule 很好,但在 RewriteRule ^index.php?book=%1? [L,R=301] 行中有小错字。在 ^/index.php?book=%1 之间添加一个空格,否则您将收到 500 语法错误。此外,您的正则表达式捕获组 (\w+) 捕获有限的字符(仅限字母数字)。如果您的查询字符串包含任何 uri 字符,请将其更改为 (.+) 所以它会是:RewriteCond %QUERY_STRING (.+) RewriteRule ^ /index.php?search=%1? [L,R=301] 顺便说一句,我正在尝试澄清搜索机器人在以前提交的“旧”站点地图和最近提交的“新”站点地图之间的任何混淆,否则尽管我更改了我的站点地图,但它们仍会继续向我发送 404 消息.显然,他们仍然保留以前的旧版本,尽管我已经做了几个月的更改。 "带有查询字符串的 URL,即:/DesignPatterns" - 这有点令人困惑,因为它“看起来不像”查询字符串。最好发布整个请求 URL。 (或者这可能是整个请求 URL,毕竟这不是查询字符串?)。否则,这意味着您拥有example.com/foo?/DesignPatterns 形式的 URL。但这与赞成和赏金分配的答案相矛盾,这表明发布的 URL-sn-p 实际上是 URL 路径,而不是查询字符串? 【参考方案1】:

完整的解决方案是

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.+) index.php?search=$1 [L]

【讨论】:

以上是关于使用 mod_rewrite 重定向查询字符串(反之亦然)的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 mod_rewrite 重定向主页

mod_rewrite:重写规则还是重定向?

使用 Mod_rewrite 将 HTTP 重定向到 HTTPS

如何从 mod_rewrited url 查询字符串中获取

mod_rewrite:如何重定向 HTTP DELETE 和 PUT

如何使用基于 404 错误的 mod_rewrite 重定向到自定义错误页面