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

5494 次点击
所在节点    PHP
23 条回复
holinhot
2015-05-16 15:33:09 +08:00
或者负载均衡模式从http改到tcp
holinhot
2015-05-16 15:44:45 +08:00
@holinhot 我目前只能先把负载均衡模式从https切换至tcp
然后在CDN开启全面SSL
用户 >>>>>CDN 443 >>>> 负载均衡 443 TCP>>>>> 内部服务器 443
msg7086
2015-05-16 15:46:13 +08:00
你负载均衡的时候给后端pass一个header不就好了
Septembers
2015-05-16 15:55:25 +08:00
前端检查下完事
if (location.protocol === 'http:') { location.protocol = 'https:'; }
b0x
2015-05-16 17:18:24 +08:00
可以在服务器上完成的事就不要用编程语言来做了,一条rewrite规则完事
wy315700
2015-05-16 17:19:21 +08:00
负载均衡是用的HTTP访问的服务器,,没把scheme传进来
flowfire
2015-05-16 19:23:20 +08:00
rewrite。。。。再不行就前端检测吧
chinassl
2015-05-16 21:04:12 +08:00
直接用301不能搞定?
holinhot
2015-05-16 21:06:29 +08:00
@chinassl 你想多了
liuhaotian
2015-05-16 21:10:00 +08:00
@Septembers 前端检测安全性0 0
正确的姿势是像 @hostker 他们的操作那样,给 https 加特殊的 header
给你们做广告诶
holinhot
2015-05-16 22:20:20 +08:00
@b0x 乱讲
holinhot
2015-05-16 22:22:45 +08:00
@Septembers 还是前端检测下吧。
holinhot
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
2015-05-16 23:05:07 +08:00
@holinhot 你写复杂了 我给出的例程应该是可以用的
holinhot
2015-05-17 00:51:52 +08:00
@Septembers 试了下你的 好像用不跳转
minongbang
2015-05-17 02:11:07 +08:00
估计很难.
b0x
2015-05-17 03:16:15 +08:00
@holinhot .. 前面复杂的流程不讲...光讨论内部服务器的http转https,你同时监听80和443不可以么- -,到80的请求重定向到https不就行了.
你用php的header()跳转,和用server的rewrite跳转,有啥本质区别....一定要用php是有多想不开
killerv
2015-05-17 08:33:56 +08:00
楼上+1,rewrite很简单的事情为什么非要PHP?
RIcter
2015-05-17 08:34:31 +08:00
@liuhaotian 跳轉https在前端並沒有什麼大礙。
liuhaotian
2015-05-17 12:39:40 +08:00
@RIcter 这样难道不就意味着并不是强制 https吗

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

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

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

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

© 2021 V2EX