2013-07-03 213 views
0

简单的mod_rewrite我试图改写搜索查询字符串

/search?keyword=foobar 

/search/foobar 

但没有成功。

我现在有这似乎产生404以下:

RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC] 
RewriteRule .* /search/%1? [L,R=301] 

回答

0

除非你在/search/foobar有资源,那么你当然会得到一个404两个完全不同的事情发生在这里。服务器拥有一个物理资源,可以被apache知道服务(或运行的脚本)。如果apache看到/search/foobar,它将查找名为“search”的目录以及名为“foobar”的目录或文件。如果它看不到,它将返回404。发生的另一部分是浏览器,与apache完全分离,会看到一个URL(例如/search/foobar),并执行它为了请求资源而需要做的事情。它与网络服务器通话,并要求/search/foobar

当请求进入时,取决于URL文件处理管道将其转化为指向资源位置的文件。如果mod_rewrite的取网址并重写为/blah/blah/blah,还有更好的是一个名为/blah/blah目录,并呼吁blah中有一个文件,否则它要404

你的规则是说,如果传入的请求是与什么查询字符串?keyword=(something),然后将浏览器重定向到/search/(something)。浏览器看到这一点,并做它应该做的事情;它发送另一个请求/search/(something)。 Apache的要看到这一点,不知道该请求是关于什么的,不知道的要求是什么,并返回404

你可能想要的是第一个,处理/search/(something) URI的

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/?search/(.*)$ /search?keyword=$1 [L,QSA] 

所以当请求以/search/foobar的形式出现时,重写引擎在内部将其重写为Apache可以理解的东西/search?keyword=foobar。这种内部重写完全发生在服务器上,浏览器对此一无所知。

现在,当一个表单作为GET方法提交时,您最终会在URL中输入?keyword=(something),看起来您正试图摆脱这种情况。所以apache获取查询字符串,并且必须有东西将浏览器重定向到更好看的URL,在这一点上浏览器做它的事情,提交一个全新的请求,由上述规则在内部重写回到它应该是。

RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*) 
RewriteRule^/search/%1?%2 [L,R=301] 
+0

它似乎仍然产生404尽管301似乎工作正常。 –

0

我整理出来有以下:

RewriteRule search/(.*)$ /search?keyword=$1 [L] 
RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*) 
RewriteRule^/search/%1?%2 [L,R=301] 

但并不完全。在存在多个查询字符串或URL中包含search/的其他URL时出现问题,例如。 /search/css/foobar.css?version=152