0

我真的希望有人知道我在这里做错了什么,因为我当然不知道!

我们网站上有一个特定页面,其中包含帐户余额信息,我们希望使用 SSL 使其安全。但我们只希望这一特定页面是安全的。我在 localhost:80 虚拟主机中有以下内容,并且效果很好:

RewriteCond %{HTTPS} off
RewriteCond %{SCRIPT_FILENAME} \/account\.php(.*) [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [QSA,L]


但是,正如您可能猜到的那样,我们希望所有其他页面只使用 HTTP。所以我把这个小片段插入到我的 localhost:443 虚拟主机中:

RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} !\/account\.php(.*) [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [QSA,L]

...这就是问题发生的时候。返回 HTTP 没有问题,但是当我单击链接转到帐户页面时,它更改为 HTTPS,但我立即收到错误 302 响应。当我删除其中任何一个重写规则时,我都没有收到此响应,只有当它们都存在时才会发生。

我尝试用 and 替换[QSA][R][R=301]无济于事。
(我知道%{HTTPS}开/关有点多余;))


所以我有两个问题:

  1. 是否有什么我忘记或做错了可能导致这种情况的原因?
  2. 是否使用[QSA]冗余$1?我们经常使用该GET方法来指定页面以及不指定页面。


我们使用的是 PHP 5.2.9 和 Apache 2。

提前谢谢了!!


布赖恩

4

1 回答 1

1

虽然它在这里(而不是移动到服务器故障)..尝试

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/account\.php https://%{HTTP_HOST}/account.php [R=301,QSA,L]

HTTP/1.1 302 = 找到(并且不是错误代码),但暂时位于另一个位置。

编辑实际上,当您将代码放在单独的虚拟主机中时,您也可以这样做

(In :80) 
RewriteRule ^/account\.php https://%{HTTP_HOST}/account.php [R=301,QSA,L]

(in :443)
RewriteCond %{REQUEST_URI} !/account\.php$
RewriteRule ^(.*) http://%{HTTP_HOST}$1 [R=301,QSA,L]
于 2010-02-18T09:26:32.003 回答