我想做以下事情:
请求:
http://www.mydomain.com/show/requested/path/here?some=var&some_other=var
应转发给
index.php?s=show/requested/path/here&some=var&some_other=var
(我的代码的最后3行,据我所知,我认为它们是正确的)
如果用户尝试发送名称为" s"通过获取请求,他应该被转发到
index.php?s=error
即:
http://www.mydomain.com/show/requested/path/here?s=var
http://www.mydomain.com/show/requested/path/here?a=b&s=var
http://www.mydomain.com/show/requested/path/here?a=b&s=var&c=d
http://www.mydomain.com/show/requested/path/here?a=b&s
http://www.mydomain.com/show/requested/path/here?s
我的问题是:以下代码是否真的正确? 它似乎与5个案例相符。但我不知道它是否与其他情况相符。我的目标是不允许发送名为" s"通过获取请求。
我的.htaccess的内容:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)(\?|&)s=?(.*)$ [NC]
RewriteRule ^(.*)$ index.php?s=error [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L,QSA]
答案 0 :(得分:1)
不,这不正确,因为你的第二条规则会将?s=...
注入请求网址,并且会匹配第二条传递中的第一条规则,并且会导致`?s =错误。
用以下代码替换您的代码:
RewriteCond %{QUERY_STRING} !(^|&)s=error(&|$) [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+.*?[?&]s\b [NC]
RewriteRule ^ index.php?s=error [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !(^|&)s=[^&]+(&|$) [NC]
RewriteRule ^(.+)$ index.php?s=$1 [L,QSA]
注意使用代表原始请求的%{THE_REQUEST}
,并且不会随着各种重写规则的应用而改变。