php http 跳转 https 问题

2015-05-16 15:21:56 +08:00
 holinhot

<?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

5661 次点击
所在节点    PHP
23 条回复
b0x
2015-05-17 15:02:01 +08:00
前端来做http跳转 https 的意义何在- -...
也就是可跳可不跳了
hostker
2015-05-17 19:56:28 +08:00
发现被人at到了,我们的做法是CDN前端遇到https在回源时候加了一个名叫KERSSL的HTTP Header,值是on,后端PHP判断有没有这个Header就可以准确判断了。其实我们的PHP环境还配合自己的前端进行了修改,https请求PHP读到的端口是443,而且$_SERVER['HTTPS']是on(这句是废话当我打广告吧)。楼主可以参考一下我们,前提是楼主有办法给CDN的https加特殊头部。

另外楼上各位说一条rewrite解决的,都没仔细看。
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没啥区别

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/191530

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX