2

我有一个搜索表单,在提交时会生成类似这样的 url:

http://mydomain.com/index.php?find=some+text

我的目标是让它看起来像:

http://mydomain.com/find/some+text

如何使用 .htaccess 做到这一点?

到目前为止,我有这个:

RewriteCond %{REQUEST_URI}  ^/index\.php$
RewriteCond %{QUERY_STRING} &?find=(.*)&?
RewriteRule ^index.php$ find/%1? [R=301,L]

RewriteRule ^find/(.*)$ index.php?find=$1 [L]

如果查询(即我搜索的内容)仅包含数字、字母或下划线,则此方法有效,但我想让它能够搜索包括空格和其他字符在内的任何内容!

4

3 回答 3

1

因此,似乎 404 错误是由于 Web 服务器中的某些配置不允许 URL 具有 +(加号)而引起的。它会在第一个 + 处中断并尝试以该名称查找文件。

整理好重写规则后是这样的:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /*.index\.php\?find=([^&\.]+)?\sHTTP
RewriteRule ^/?index.php$ /find/%1? [L,R=301]
RewriteRule ^/?find/(.*)$ /index.php?find=$1 [L,NC]

谢谢你的帮助!

于 2012-10-23T10:33:48.100 回答
0

不应该这样的工作吗?

RewriteRule ^find/([^/]*)$ /index.php?find=$1 [L]
于 2012-10-22T11:41:18.967 回答
0

您需要匹配实际请求而不是 URI,因为 URI 是通过您的第二条规则重写的。这会导致重定向循环。

重定向浏览器:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?find=([^&\.]+)(&([^\ ]+))?
RewriteRule ^/?index.php$ /find/%1?%3 [L,R=301]

内部重写

RewriteRule ^/?find/(.*)$ /index.php?find=$1 [L,QSA]
于 2012-10-22T18:19:49.133 回答