【问题标题】:.htaccess mod_rewrite: rewriting querystring to path.htaccess mod_rewrite:将查询字符串重写为路径
【发布时间】:2013-07-04 05:46:58
【问题描述】:

我如何使用重写来改变:

/?tag=foo

收件人:

/tag/foo

我试过了:

RewriteCond %{QUERY_STRING} ^tag=(.+)$
RewriteRule ^(.*)$ http://www.example.com/tag/$1 [L]

但它不起作用。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    尝试以下方法:

    RewriteCond %{QUERY_STRING} ^tag=(.+)$
    RewriteRule ^(.*)$ http://www.example.com/tag/%1 [L]
    

    通常,使用重写来达到相反的效果。您确定您真的不想执行以下操作吗?

    RewriteRule ^tag/(.+)$ index.php?tag=$1 [L]
    

    【讨论】:

      【解决方案2】:

      为避免递归,您应该检查request line,因为%{QUERY_STRING} 中的查询字符串可能已被另一条规则更改:

      RewriteCond %{THE_REQUEST} ^GET\ /\?(([^&\s]*&)*)tag=([^&\s]+)&?([^\s]*)
      RewriteRule ^(.*)$ /tag/%3?%1%4 [L,R=301]
      

      然后您可以在内部重写该请求而不会发生冲突:

      RewriteRule ^tag/(.*) index.php?tag=$1 [L]
      

      【讨论】:

      • Andrew Moore 和 Gumbo 谢谢,但非常感谢。我试图解决一个多星期没有成功。 Gumbo 提出的解决方案解决了这个问题。当遇到愿意帮助不认识的人的人时,我确信我们可以拥有一个更美好的世界。对不起错误,但我的英语知识非常有限。我只想感谢。维拉
      • 当类似帖子上的所有其他 stackoverflow 答案都无法解决时,您解决了我的问题。谢谢
      【解决方案3】:

      我试图从这样的 URL 进行转换:

      http://java.scandilabs.com/faq?key=Contents_of__gitigno
      

      到这样的网址:

      http://scandilabs.com/technology/knowledge/Contents_of__gitigno
      

      安德鲁上面的回答对我有用,在末尾添加了一个问号以丢弃原始查询字符串:

      RewriteCond %{HTTP_HOST} ^java
      RewriteCond %{QUERY_STRING} ^key=(.+)$    
      RewriteRule ^(.*)$ http://scandilabs.com/technology/knowledge/%1? [R=301,L]
      

      请注意,如果您使用的是 apache 2.4 或更高版本,您可能可以使用 QSD 标志而不是问号。

      【讨论】:

        猜你喜欢
        • 2016-03-26
        • 2012-10-11
        • 2021-12-10
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        相关资源
        最近更新 更多