我正在尝试重写
/search?keyword=foobar
到
/search/foobar
没有太大的成功。
我目前有以下似乎产生了404:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
答案 0 :(得分:0)
除非你有资源/search/foobar
,否则你当然会得到404.这里发生了两件完全不同的事情。服务器有一个物理资源,可以获得apache所知道的服务(或运行的脚本)。如果apache看到/search/foobar
,它将查找名为“search”的目录以及名为“foobar”的目录或文件。如果它没有看到,它将返回404.正在发生的另一部分是浏览器,与apache完全分开,看到一个URL(例如/search/foobar
)并做了它需要做的事情以便请求资源。它与网络服务器交谈并询问/search/foobar
。
当请求进入时,由URL文件处理管道决定将其转换为指向资源所在位置的文件。如果mod_rewrite获取URL并将其重写为/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]
答案 1 :(得分: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