简单的mod_rewrite我试图改写搜索查询字符串
/search?keyword=foobar
到
/search/foobar
但没有成功。
我现在有这似乎产生404以下:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
简单的mod_rewrite我试图改写搜索查询字符串
/search?keyword=foobar
到
/search/foobar
但没有成功。
我现在有这似乎产生404以下:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
除非你在/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]
我整理出来有以下:
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
它似乎仍然产生404尽管301似乎工作正常。 –