htaccess 使用 GET 参数重定向 URL

htaccess Redirect URL with GET Parameters

我有一个 URL 格式为 http://www.example.com/?s=query

我想将此 URL 重定向到 http://www.example.com/search/query

我有以下 .htaccess 但我想检查一下是否有任何问题。我的 RewriteRule 看起来有点不稳定,我不知道它是否会给其他 URL 带来问题。

RewriteEngine on
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]

我 运行 测试 Here 它似乎重定向到正确的 URL.

RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]

如果您接收到 % 编码的 URL 参数值,您可能需要 RewriteRule 指令上的 NE (noescape) 标志,否则目标URL 将被双重编码。 QUERY_STRING 服务器变量未被 Apache 解码。

这还取决于您如何将 /search/query 重写回 /?s=query(或者可能更像 /index.php?s=query?)- 大概您已经在稍后的配置中这样做了?您只希望此重定向应用于直接请求而不是重写请求(否则您将获得重定向循环)。确保这一点的一种简单方法是检查 REDIRECT_STATUS env var 是否为空。

例如:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^s=(.*) [NC]
RewriteRule ^$ /search/%1 [NE,QSD,R,L]

其他要点:

  • QSD 标志(在 Apache 2.4 上)比将 ? 附加到 susbtitution 字符串的末尾更可取,以便删除查询字符串。
  • 正则表达式 ^s=(.*)(尾部 $ 是多余的)确实假设 s 是查询字符串开头唯一的 URL 参数。就目前而言,一切 都被假定为该值的一部分。例如。 s=foo&bar=1 将导致 /search/foo&bar=1.
  • RewriteRule 指令中的 NC 标志是多余的。
  • 您还应该检查 /index.php?s=<query> 吗? (或者 file/DirectoryIndex 正在处理请求。)