我有一个搜索表单,在提交时生成类似这样的网址:
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]
如果查询(即我搜索的内容)仅包含数字,字母或下划线,则此方法有效,但我希望能够搜索包含空格和其他字符在内的任何内容!
答案 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]