使用 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 将 HTTP 重定向到 HTTPS