2011-02-24 108 views
70

我正在购物车网站上工作,我想在用户输入帐单详细信息时将用户重定向到HTTPS页面,并在下一页保持HTTPS连接,直到他注销。使用PHP从HTTP重定向到HTTPS

为了做到这一点,我需要在服务器上安装什么(我使用的是Apache),以及如何从PHP完成此重定向?

回答

166

尝试是这样的(应为Apache和IIS工作):

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){ 
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    header('HTTP/1.1 301 Moved Permanently'); 
    header('Location: ' . $redirect); 
    exit(); 
} 
+3

它不总是工作。我尝试过使用它,并且$ _SERVER数组中没有'https'元素,因此它给出了'太多重定向'的错误。将需要使用其他方法。 – 2012-04-09 16:14:40

+0

我在几分钟内编辑了这个问题,也许这会对你有用 – 2012-04-14 22:24:53

+5

我不得不测试'if($ _SERVER ['HTTPS'] ==“off”)'让这段代码正常工作。我认为这是因为我在IIS上,而不是像OP那样的Apache。 – 2013-04-26 19:43:29

5

您可以随时使用

header('Location: https://www.domain.com/cart_save/'); 

重定向到URL保存。

但我会建议通过.htaccess和Apache重写规则来做到这一点。

+11

我总是建议重定向前检查$ _ SERVER [“HTTPS”]。 – 2011-02-24 15:01:55

+0

$ _SERVER ['HTTPS']并不总是设置,但最好先检查一下。这就是为什么我建议在Apache中使用有用的重写规则来做到这一点,它只在不使用HTTPS时重定向。 – powtac 2011-02-24 15:03:23

+0

尽管Apache建议不要使用额外的.htaccess文件(因为它会减慢速度),而是使用Apache * .conf中的重写规则。 – powtac 2013-05-15 08:27:50

3

从HTTP重定向到HTTPS与PHP在IIS

我遇到了麻烦重定向到HTTPS,以在Windows工作服务器 运行版本6的MS Internet信息服务(IIS)。我更多 用于在Linux主机上使用Apache,所以我转向互联网寻求 帮助,这是当我搜索 为“php redirect http to https”时排名最高的堆栈溢出问题。但是,所选答案对我来说不起作用 。

一些试验和错误之后,我发现,与IIS,$_SERVER['HTTPS']是 设置为off非TLS连接。我认为下面的代码 可以帮助任何其他通过搜索引擎来到这个问题的IIS用户。

<?php 
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off') { 
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    header("Location: $redirect_url"); 
    exit(); 
} 
?> 

编辑:从另一个Stack Overflow answer, 一个简单的解决方法是检查if($_SERVER["HTTPS"] != "on")

+0

好吧......但是op说他正在使用apache – 2016-03-22 23:02:54

+6

@JakeSylvestre够了。鉴于这个问题没有被标记为'apache',我发布了这个答案,以便其他IIS用户(类似于我所处的情况)可能会通过搜索引擎遇到此页面。我赞同这样的观点,即答案是为了整个社区的利益,而不仅仅是OP。 – 2016-03-22 23:36:58

5

这是一个很好的办法做到这一点:

<?php 
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
    $_SERVER['HTTPS'] == 1) || 
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && 
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) 
{ 
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    header('HTTP/1.1 301 Moved Permanently'); 
    header('Location: ' . $redirect); 
    exit(); 
} 
?> 
+1

效果不错,标记为良好的那个会在Chrome中至少返回一次重定向 – 2017-08-30 20:55:07