2011-10-04 67 views
2

我有一个搜索表单发送GET请求到一个名为search.php的页面。我已经在我的htaccess文件中重写了一些规则,这些规则将某些事情(比如/ search)重写到各自的页面。我只是想采取search.php?q =查询并将其重写到/ search/query。简单的htaccess重写/重定向到搜索页面

这是我的。

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] 

回答

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文件,这可以防止达到该规则。

+0

仍然无法正常工作......任何其他建议?我将发布我的完整.htaccess文件。 – watzon

+0

@ sun-tzu:看修改后的答案。 'RewriteCond%{REQUEST_FILENAME}!-f'行是您的问题,或者更具体地说,是放置。 –

+0

我很抱歉地说..但RewriteRule不能用这种方式查询字符串 - 这不会工作'search \ .php?q =(。*)$'。 RewriteRule模式将只与URL的路径部分匹配。即使它会......你极有可能得到一个重写循环(这就是mod_rewrite和.htaccess的工作方式) – LazyOne

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]