0

我正在尝试重写

/search?keyword=foobar

/search/foobar

没有太大的成功。

我目前有以下似乎会产生 404:

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

2 回答 2

0

我通过以下方式对其进行了整理:

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

于 2013-07-04T02:55:25.690 回答
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/search?keyword=foobar. 这种内部重写完全发生在服务器上,浏览器对此一无所知。

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

RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*)
RewriteRule ^ /search/%1?%2 [L,R=301]
于 2013-07-04T00:27:29.927 回答