V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
holinhot
V2EX  ›  PHP

php http 跳转 https 问题

  •  1
     
  •   holinhot · 2015-05-16 15:21:56 +08:00 · 5636 次点击
    这是一个创建于 3479 天前的主题,其中的信息可能已经有所发展或是发生改变。

    <?php
    //http转化为https

    if ($_SERVER["HTTPS"] <> "on")
    {
    $xredir="https://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    header("Location: ".$xredir);
    }
    ?>

    用此代码会出现死循环

    我的应用
    SSL CDN加速>>>>>SSL七层负载均衡>>>>>内部nginx没有SSL
    浮在均衡器配置443转向内部80
    并且负载均衡器上也配置有证书
    cdn上也有证书

    如何做http跳转https啊
    如果在cdn上开启全面ssl即cdn访问源网站使用http模式那么上面的代码就行不通了会死循环因为php判断的是内部服务器的$_SERVER["HTTPS"。判断结果是http那么跳转到https 但是cdn上永远会使用http访问源网站

    如果开启全面ssl
    即 cdn开启ssl ,负载均衡器开启ssl 负载均衡器到内部服务器也启用ssl 这样三层加密速度慢不说 我测试了一下好像也会重复定向

    我画一下请求过程
    HTTP
    CDN 80 >>>> 负载均衡 80>>>>> 内部服务器 80 完全正常

    HTTPS模式
    用户>>>>>CDN 443 >>>> 负载均衡 80>>>>> 内部服务器 80 怎么做http跳转到https
    用户 >>>>>CDN 443 >>>> 负载均衡 443>>>>> 内部服务器 80 怎么做http跳转到https
    用户 >>>>>CDN 443 >>>> 负载均衡 443>>>>> 内部服务器 443 怎么做http跳转到https
    如果不做跳转上面3钟HTTPS模式访问都正常
    但是要做跳转都会出现重复定向 怎么破啊大神们看看

    而且负载均衡器好像也不支持SNI

    23 条回复    2015-05-17 21:48:45 +08:00
    holinhot
        1
    holinhot  
    OP
       2015-05-16 15:33:09 +08:00
    或者负载均衡模式从http改到tcp
    holinhot
        2
    holinhot  
    OP
       2015-05-16 15:44:45 +08:00
    @holinhot 我目前只能先把负载均衡模式从https切换至tcp
    然后在CDN开启全面SSL
    用户 >>>>>CDN 443 >>>> 负载均衡 443 TCP>>>>> 内部服务器 443
    msg7086
        3
    msg7086  
       2015-05-16 15:46:13 +08:00
    你负载均衡的时候给后端pass一个header不就好了
    Septembers
        4
    Septembers  
       2015-05-16 15:55:25 +08:00
    前端检查下完事
    if (location.protocol === 'http:') { location.protocol = 'https:'; }
    b0x
        5
    b0x  
       2015-05-16 17:18:24 +08:00
    可以在服务器上完成的事就不要用编程语言来做了,一条rewrite规则完事
    wy315700
        6
    wy315700  
       2015-05-16 17:19:21 +08:00
    负载均衡是用的HTTP访问的服务器,,没把scheme传进来
    flowfire
        7
    flowfire  
       2015-05-16 19:23:20 +08:00
    rewrite。。。。再不行就前端检测吧
    chinassl
        8
    chinassl  
       2015-05-16 21:04:12 +08:00
    直接用301不能搞定?
    holinhot
        9
    holinhot  
    OP
       2015-05-16 21:06:29 +08:00
    @chinassl 你想多了
    liuhaotian
        10
    liuhaotian  
       2015-05-16 21:10:00 +08:00
    @Septembers 前端检测安全性0 0
    正确的姿势是像 @hostker 他们的操作那样,给 https 加特殊的 header
    给你们做广告诶
    holinhot
        11
    holinhot  
    OP
       2015-05-16 22:20:20 +08:00
    @b0x 乱讲
    holinhot
        12
    holinhot  
    OP
       2015-05-16 22:22:45 +08:00
    @Septembers 还是前端检测下吧。
    holinhot
        13
    holinhot  
    OP
       2015-05-16 23:00:47 +08:00
    @Septembers

    <script language="JavaScript">
    function check_secure() {
    var httpsRE = /^https/i;
    if (!window.location.origin.match(httpsRE)) {
    window.location = "https://" + window.location.hostname + window.location.pathname + window.location.search;
    }
    }
    check_secure();
    </script>

    反正就一个简单的页面
    Septembers
        14
    Septembers  
       2015-05-16 23:05:07 +08:00 via Android
    @holinhot 你写复杂了 我给出的例程应该是可以用的
    holinhot
        15
    holinhot  
    OP
       2015-05-17 00:51:52 +08:00
    @Septembers 试了下你的 好像用不跳转
    minongbang
        16
    minongbang  
       2015-05-17 02:11:07 +08:00
    估计很难.
    b0x
        17
    b0x  
       2015-05-17 03:16:15 +08:00
    @holinhot .. 前面复杂的流程不讲...光讨论内部服务器的http转https,你同时监听80和443不可以么- -,到80的请求重定向到https不就行了.
    你用php的header()跳转,和用server的rewrite跳转,有啥本质区别....一定要用php是有多想不开
    killerv
        18
    killerv  
       2015-05-17 08:33:56 +08:00 via Android
    楼上+1,rewrite很简单的事情为什么非要PHP?
    RIcter
        19
    RIcter  
       2015-05-17 08:34:31 +08:00 via iPhone
    @liuhaotian 跳轉https在前端並沒有什麼大礙。
    liuhaotian
        20
    liuhaotian  
       2015-05-17 12:39:40 +08:00 via iPhone
    @RIcter 这样难道不就意味着并不是强制 https吗
    b0x
        21
    b0x  
       2015-05-17 15:02:01 +08:00
    前端来做http跳转 https 的意义何在- -...
    也就是可跳可不跳了
    hostker
        22
    hostker  
       2015-05-17 19:56:28 +08:00   ❤️ 1
    发现被人at到了,我们的做法是CDN前端遇到https在回源时候加了一个名叫KERSSL的HTTP Header,值是on,后端PHP判断有没有这个Header就可以准确判断了。其实我们的PHP环境还配合自己的前端进行了修改,https请求PHP读到的端口是443,而且$_SERVER['HTTPS']是on(这句是废话当我打广告吧)。楼主可以参考一下我们,前提是楼主有办法给CDN的https加特殊头部。

    另外楼上各位说一条rewrite解决的,都没仔细看。
    b0x
        23
    b0x  
       2015-05-17 21:48:45 +08:00
    假设nginx,同一个vhost下两个server段定义分别监听80和443

    server {
    listen 80;
    server_name ooxx.com;
    rewrite ^(.*) https://$server_name$1 permanent;
    }

    server {
    listen 443;
    server_name ooxx.com;
    ssl on;
    #下方配置省略...
    }


    其实同是server side,web server的rewrite permanent和用php的header()做一个301没啥区别
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2649 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 03:24 · PVG 11:24 · LAX 19:24 · JFK 22:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.