【问题标题】:mod_rewrite append string to querymod_rewrite 追加字符串到查询
【发布时间】:2012-02-05 15:27:02
【问题描述】:

我正在尝试转换此 URL:

http://localhost/?q=foo&s=search

关于这个:

http://localhost/?q=+foo&s=search (i add a plus sign before the user query)

我试过了:

RewriteCond %{QUERY_STRING} ^q=(.*)$ [NC]
RewriteRule ^(.*)$ /?q=\+%1 [R=301,L,NE]

但这会产生:

http://localhost/?q=+++++++++++++++++++++foo

关于如何在查询前添加加号的任何建议?

【问题讨论】:

    标签: apache url mod-rewrite redirect


    【解决方案1】:

    两个快速/简单的选择:

    1. 在后端添加+(PHP:$query = '+' . $_GET['q'];
    2. 添加一个指示重定向并避免重定向的参数。

      # The example is untested, but the idea is to add an extra 
      # query parameter (rw=1). When the redirect comes back through, 
      # the redirect is not applied, as the '+' as already been 
      # put on the beginning.
      
      RewriteCond %{QUERY_STRING} !&rw=1$ [NC]
      RewriteCond %{QUERY_STRING} ^q=(.*)$ [NC]
      RewriteRule ^(.*)$ /?q=\+%1&rw=1 [R=301,L,NE]
      

    【讨论】:

    • 感谢@clmarquart 它有效。诀窍是应用 rw=1 来避免重定向循环?顺便问一下,为什么会出现循环?
    • 发生循环是因为重定向执行了一个全新的 HTTP 请求,该请求再次通过 Apache。这会导致重定向再次发生,然后再次发生。在这种情况下,只需要新的查询参数,因此您可以使用 RewriteCond 对其进行检查,以确保它尚未发生。
    • 抱歉又打扰你了,但我有一个新问题。我的搜索页面有一个插件来生成结果的分页,例如:<prev 1 2 3 next>。每个数字都有一个链接到一个页面,该页面保留查询并附加一个?pg=# 参数。问题是每次用户按下数字链接时都会添加一个新的加号。因此,如果您按下链接 1 和下一个 2 和下一个 3,您会得到一个带有三个“+++”的查询:http://localhost/?q=+++foo&s=search?pg=4。如何设置规则以避免每次都添加加号?
    • 尝试添加:RewriteCond %{QUERY_STRING} !q=\+ 这应该会导致在添加 + 后 RewriteRule 不匹配。实际上,如果该条件有效,您可能可以完全摆脱 rw=1
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    相关资源
    最近更新 更多