【问题标题】:htaccess Redirect URL with GET Parametershtaccess 使用 GET 参数重定向 URL
【发布时间】:2021-11-02 18:59:23
【问题描述】:

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

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

我有以下.htaccess,但我想检查一下这是否有任何问题。我的RewriteRule 看起来有点不靠谱,不知道会不会对其他网址造成问题。

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

我运行了一个测试 Here,它似乎重定向到了正确的 URL。

【问题讨论】:

  • 在我看来还不错。但是您还需要注意使用该新表单实际处理传入的请求。

标签: apache .htaccess mod-rewrite url-rewriting


【解决方案1】:
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 环境变量是否为空。

例如:

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

其他要点:

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

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2010-10-09
    相关资源
    最近更新 更多