使用查询字符串的重写工作,但是当我从干净的网址提交新的查询时,它只是附加旧查询字符串的网址

时间:2014-08-21 04:13:22

标签: regex .htaccess mod-rewrite query-string

这是我的重写规则和条件

#link ReWrite
RewriteRule ^searchresults/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /searchresults.php?search=1&year_search_type=single&isused=$1&year=$2&make=$3&model=$4&price=$5 [L]

#query Rewrite
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
RewriteCond %{REQUEST_URI} ^/searchresults.php [NC]
RewriteCond %{QUERY_STRING} ^.*[&]?isused=(\w+).*&year=(\w+).*&make=(\w+).*&model=(\w+).*&price=(\w+).*$ [NC]
RewriteRule . /searchresults/%1/%2/%3/%4/%5? [R=301,L]

情况 - 我有一个搜索数据库并显示结果的搜索页面。此设置捕获查询并将其重写为清理网址(太棒了!)但是,如果我第二次运行查询,也就是来自清理的网址,搜索请求现在只是将原始的?key = value& key =值添加到清理url提出请求。

searchresults.php?make = value& model = value变成searchresults / value / value,因为我希望它

但是当我从searchresults / value / value运行第二个查询时,它最终会将其转换为
        / SearchResult所/值/值作出=值安培;模型=值

任何方式都可以从.htaccess内部打败它,因为搜索查询本身就是在一些深层的php疯狂的代码之地,我老实说甚至无法找到这个东西,所以编辑php不在卡片中。

另外,作为奖励,如果有人可以告诉我要进行哪些编辑,以便当查询发送看起来像key = value + with + spaces的请求时,我会得到正确的干净网址?现在它需要key = value + with + spaces并给我回“value”但是用+空格掉落并移动到下一个键值对....

谢谢

1 个答案:

答案 0 :(得分:0)

不确定为什么你遇到这个问题,你的规则对于我在一个空白的htaccess文件中安装一个vanilla apache非常好。但您可以尝试稍微改变一下规则:

您需要做的第一件事是交换两条规则的顺序。重定向规则必须在之前进行任何内部重写。这可以防止将两个规则应用于同一个请求(重写引擎会遍历所有规则,直到URI停止更改)。其次,您需要针对实际请求进行匹配,而不是针对%{QUERY_STRING}变量进行%{THE_REQUEST}匹配:

RewriteCond %{THE_REQUEST} \ /+searchresults\.php\?.*[&]?isused=(\w+).*&year=(\w+).*&make=(\w+).*&model=(\w+).*&price=(\w+).*$ [NC]
RewriteRule ^ /searchresults/%1/%2/%3/%4/%5? [R=301,L]

RewriteRule ^searchresults/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /searchresults.php?search=1&year_search_type=single&isused=$1&year=$2&make=$3&model=$4&price=$5 [L]