首页 > 解决方案 > htaccess 使用 GET 参数重定向 URL

问题描述

我有一个格式为的 URLhttp://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]

我在这里进行了测试,它似乎重定向到正确的 URL。

标签: apache.htaccessmod-rewriteurl-rewriting

解决方案


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

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

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

例如:

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

其他要点:

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

推荐阅读