为什么在重写URL中重复查询字符串?

时间:2013-03-20 04:36:09

标签: .htaccess rewrite query-string

我有这些重写。第一个(用于图库)按预期工作。第二个(用于照片)有效,但重复查询字符串。所以它转发到:http://www.domain.com/photo-TheID?id=TheID

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /gallery\.php\?set=([^/]*)\ HTTP/
RewriteRule ^gallery\.php$ http://www.domain.com/gallery?set=%1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /photo\.php\?id=([^/]*)\ HTTP/
RewriteRule ^photo\.php$ http://www.domain.com/photo-%1 [R=301,L]

但是,如果我添加?到重写者的结束时

RewriteRule ^photo\.php$ http://www.domain.com/photo-%1? [R=301,L]

然后按预期工作转发到:http://www.domain.com/photo-TheID

我的问题是为什么在没有“?”的情况下重复查询字符串在末尾?这对我来说非常困惑,因为第一次重写(画廊)没有?但它不会重复查询字符串。如果我加?在画廊重写的末尾,它将“%3f”添加到网址的末尾。

1 个答案:

答案 0 :(得分:1)

因为它会自动附加,除非您在替换URL中放置一个尾随问号,前提是它不包含新的查询字符串。

  

如果要删除现有查询字符串,请仅使用问号”结束替换字符串。

     

检查此Apache链接中的标题Modifying the Query String

你的问题:

  

这对我来说非常困惑,因为第一次重写(画廊)没有?

原因是第一个重写规则:

RewriteRule ^gallery\.php$ http://www.domain.com/gallery?set=%1 

创建一个新的查询字符串,在这种情况下,除非您使用 QSA 标志明确地执行此操作,否则不会自动附加传入的查询字符串。