我的mod重写代码是否正确?

时间:2013-09-02 10:29:51

标签: regex apache .htaccess mod-rewrite apache2

我想做以下事情:

请求:

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]

1 个答案:

答案 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},并且不会随着各种重写规则的应用而改变。