PHP - 从HTTP重定向到HTTPS时维护会话?

时间:2010-07-08 15:38:52

标签: php session mod-rewrite https

我正在开发一个简单的购物车。当用户点击结帐时,网址会从HTTP更改为HTTPS。不幸的是,会话似乎没有结束,我收到有关$ _SESSION ['cart'](我持有信息)不存在的错误。

我尝试使用mod_rewrite将所有HTTP重定向到HTTPS,以便会话全部都在HTTPS上:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

这很有用。但是,一个页面上嵌有谷歌地图,它是一个HTTP URL,因此IE会发出有关某些元素不安全的警告等。

所以,我要么知道如何使用mod-rewrite排除页面(当我尝试时它发送了无限重定向循环),或者维持http和https之间的会话。感谢。

2 个答案:

答案 0 :(得分:1)

没有理由让您的整个网站使用https,您可以执行以下操作,仅将必要的网页重定向到https:

# force https for checkout pages
RewriteCond %{HTTPS} !on
RewriteCond %{SCRIPT_FILENAME} (checkout|register|login).php$
RewriteRule (.*) https://www.example.com/$1 [R,QSA,L]

# non-secure pages
RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} !(checkout|register|login).php$
RewriteRule (.*) http://www.example.com/$1 [R,QSA,L]

没有理由你无法在安全页面上访问http的cookie集,我一直这样做(除非你使用安全的cookie,如果是这样的话,解决方案是不使用安全的cookie或make确保您的整个商店都是https)。

此外,如果您从http://example.com重定向到http://www.example.com,您将丢失Cookie。

但是要回答你的问题,如果你想让你的整个网站使用https而不是地图页面,你可以这样做:

RewriteCond %{HTTPS} !on
RewriteCond %{SCRIPT_FILENAME} !map.php
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} map.php
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

答案 1 :(得分:1)

这里有很多方法: Session lost when switching from HTTP to HTTPS in PHP

只是在页面上的链接中处理HTTPS - 处理此问题的一种方法是让您的绝对URL成为一个明确的常量,具体取决于SSL是否处于活动状态。

if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off'){
define('ABS_URL' , 'http://www.your-domain.com'); 
}else if($_SERVER['HTTPS'] == 'on'){
define('ABS_URL' , 'https://www.your-domain.com'); 
}

然后,您可以使用ABS_URL替换结帐页面中绝对网址的所有实例。