代码之家  ›  专栏  ›  技术社区  ›  bcoughlan

从HTTP重定向到HTTPS时是否维护会话?

  •  2
  • bcoughlan  · 技术社区  · 15 年前

    我在做一个简单的购物车。当用户单击签出时,URL从HTTP更改为HTTPS。不幸的是,会话似乎没有结转,并且我得到了关于$\u session['cart']不存在的错误(我保存信息的地方)。

    我尝试使用mod_rewrite将所有http重定向到https,以便会话都在https上:

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

    这是有效的。但是,有一个页面嵌入了谷歌地图,它是一个HTTP URL,因此IE会警告某些元素不安全等等。

    所以,我要么需要知道如何用mod rewrite排除一个页面(当我尝试时它发送给我一个无限重定向循环),要么需要维护HTTP和HTTPS之间的会话。谢谢。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Rob    15 年前

    没有理由让您的整个网站使用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或确保你的整个存储是http s)。

    另外,如果你正在重新定向,比如, http://example.com http://www.example.com 你的饼干会丢的。

    但是为了回答你的问题,如果你想让你的整个网站使用除地图页面之外的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}
    
        2
  •  1
  •   Community CDub    8 年前

    这里有很多方法: 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替换签出页面中绝对URL的所有实例。