我真的希望有人知道我在这里做错了什么,因为我肯定不知道!
我们网站上有一个特定页面,其中包含帐户余额信息,我们希望通过 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 响应。当我删除这些重写规则中的任一个时,我没有收到此响应,只有当它们都存在时才会发生。
我尝试用 [R]
和 [R=301]
替换 [QSA]
,但无济于事。
(我知道 %{HTTPS}
开/关有点多余;))
所以我有两个问题:
- 是否有我忘记或做错的事情导致了这种情况?
- 使用
[QSA]
是否与$1
多余?我们经常使用GET
方法来指定页面和其他内容。
我们使用的是 PHP 5.2.9 和 Apache 2。
提前致谢!
布莱恩
最佳答案
虽然它在这里(并没有移动到 serverfault)..尝试
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/account\.php https://%{HTTP_HOST}/account.php [R=301,QSA,L]
HTTP/1.1 302 = 找到(并且不是错误代码),但暂时在另一个位置。
编辑 实际上,当您将代码放在单独的 VirtualHost 中时,您也可以这样做
(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]
关于apache - 使用 Apache Rewrite 从 HTTP 转到 HTTPS,反之亦然,但我收到 302 响应并且我的应用程序出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287107/