如何在不使用查询字符串的情况下将搜索表单生成的查询字符串转换为新URL?

时间:2012-10-22 11:14:20

标签: php .htaccess search redirect query-string

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

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]

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

3 个答案:

答案 0 :(得分:1)

因此,由于Web服务器中的一些配置不允许URL具有+(加号),因此导致404错误的原因。 它将在第一个+中断并尝试按该名称查找文件。

将整理后的重写规则排除在外:

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]

感谢您的帮助!

答案 1 :(得分:0)

不应该这样的工作吗?

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

答案 2 :(得分: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]