1

我想做以下事情:

要求:

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 行,据我所知,我认为它们是正确的)

如果用户试图通过 get 请求发送一个名为“s”的 var,他应该被转发到

index.php?s=error

IE:

  • 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]
4

1 回答 1

1

不,这是不正确的,因为您的第二条规则将注入?s=...请求 URL,并且将匹配第二遍中的第一条规则并导致 `?s=error.

将您的代码替换为:

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}其中的使用代表原始请求并且不会随着各种重写规则的应用而改变。

于 2013-09-02T10:48:44.120 回答