我正在尝试重写
/search?keyword=foobar
至
/search/foobar
没有太大的成功。
我目前有以下似乎会产生 404:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
我正在尝试重写
/search?keyword=foobar
至
/search/foobar
没有太大的成功。
我目前有以下似乎会产生 404:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
我通过以下方式对其进行了整理:
RewriteRule search/(.*)$ /search?keyword=$1 [L]
RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*)
RewriteRule ^ /search/%1?%2 [L,R=301]
但不完全。在 URL 中包含多个查询字符串或其他一些 URL 时遇到问题search/
,例如。/search/css/foobar.css?version=152
除非你/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
以/search?keyword=foobar
. 这种内部重写完全发生在服务器上,浏览器对此一无所知。
现在,当表单作为 GET 方法提交时,您最终会?keyword=(something)
在 URL 中得到 a,看起来您正试图摆脱它。所以 apache 获取了查询字符串,并且必须有一些东西可以将浏览器重定向到看起来更漂亮的 URL,此时浏览器会做它的事情,提交一个全新的请求,该请求在内部被上述规则重写回它应该的是。
RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*)
RewriteRule ^ /search/%1?%2 [L,R=301]