我有一个搜索表单,它向名为search.php的页面发送GET请求。我在我的htaccess文件中设置了重写规则,将某些内容(例如/ search)重写到各自的页面。我只想采取search.php?q =查询并将其重写为/ search / query。
这就是我所拥有的。
RewriteRule search.php?q=(.*) /search/$1
RewriteRule search/(.*) search.php?q=$1 [nc]
我做错了什么?!
这是完整的文件
ErrorDocument 404 /index.php?p=404
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^images/.*\.jpg$ /images/default.jpg [L]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?wghandcrafted.com/.*$ [NC]
RewriteRule \.(gif|jpg|jpeg|psd|js|swf|flv|png)$ /feed/ [R=302]
RewriteRule ^(products|blog|feed|search|checkout|checkout)$ $1.php [nc]
RewriteRule products/cat/(.*)$ products.php?type=cat&cat=$1 [nc]
RewriteRule products/(.*)$ products.php?type=single&product=$1 [nc]
RewriteRule blog/(.*) blog.php&post=$1 [nc]
RewriteRule feed/(.*) feed.phptype=$1 [nc]
RewriteRule search\.php?q=(.*)$ /search/$1 [R=301,L]
RewriteRule search/(.*)$ search.php?q=$1 [NC]
答案 0 :(得分:2)
使第一行执行重定向,第二行执行重写
RewriteRule search\.php?q=(.*)$ /search/$1 [R=301,L]
RewriteRule search/(.*)$ search.php?q=$1 [NC]
并移动
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^images/.*\.jpg$ /images/default.jpg [L]
到规则集的末尾。
否则,RewriteCond %{REQUEST_FILENAME} !-f
规则在其他任何事情之前被制定,这意味着只有对该非线路文件的请求才会被该行下面的任何规则处理。由于存在search.php
文件,因此可以防止达到该规则。
答案 1 :(得分:0)
我遇到了同样的问题,这里有一个解决方案,我发现它对我有用,在我的网站上查询被发送到index.php,我发现如果我有“^ index.php $ / search /%1 ?[R = 301]“作为第一个重写规则,它只会因为第二次重写规则而错误输出,因为它只是进入一个循环所以我用”^ $“替换了”^ index.php $“,允许它仍然请求同一个文件。它可能不是最好的解决方案,但可以解决这个问题。这是我的工作代码:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{QUERY_STRING} ^q=(.*)$
RewriteRule ^$ /search/%1? [R=301]
RewriteBase /search
RewriteRule ^search/(.*)$ /index.php?q=$1 [NC]