使用PHP从HTTP重定向到HTTPS


107

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

为此,我需要在服务器上安装什么(我正在使用Apache),如何从PHP重定向?

Answers:


247

尝试这样的事情(应该适用于Apache和IIS):

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

5
它并不总是有效。我尝试使用它,并且$ _SERVER数组中没有'https'元素,因此它给出了'太多重定向'错误。需要使用其他方法。
Usman Zaheer 2012年

5
我必须进行测试if( $_SERVER['HTTPS'] == "off")才能使此代码正常工作。我认为这是因为我使用的是IIS,而不是OP上的Apache。
Nick Pickering

1
@NicholasPickering Jepp,$ _ SERVER变量可能随网络服务器而异。
拉斐尔·米歇尔

6
注意:die()或exit()对于在头标重定向之后放置很重要,以防止执行页面的其余部分(并可能向客户端发送额外的信息)(即向可能不尊重头标的黑客或浏览器)。
dajon

3
根据您的服务器环境/设置,您可能需要使用$ _SERVER ['HTTP_X_FORWARDED_PROTO']检查http / https
David Meister

19

这是一个很好的方法:

<?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中,标为“良好”的代码至少会多次返回重定向
Thomas J Younsi

条件!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'将始终为false,因为如果最后一部分为true,则第一部分为false。
最高

@Max:我不明白你的意思。如果第二个条件为真($ _SERVER ['HTTPS'] =='on'),则第一个条件也必须为TRUE(当然,服务器变量已设置,因为它包含一个值!)
OMA

7

在IIS上使用PHP从HTTP重定向到HTTPS

我无法重定向到HTTPS,无法在运行MS Internet Information Services(IIS)版本6的Windows服务器上工作。我比较习惯在Linux主机上使用Apache,因此我向Internet寻求帮助,这是当我搜索“ php redirect http to https”时排名最高的Stack Overflow问题。但是,选择的答案对我不起作用。

经过一番尝试和错误后,我发现对于IIS,对于非TLS连接,$_SERVER['HTTPS']它设置off为。我认为以下代码应该可以帮助通过搜索引擎解决此问题的所有其他IIS用户。

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

编辑:从另一个堆栈溢出答案,一个更简单的解决方案是检查if($_SERVER["HTTPS"] != "on")


13
@JakeSylvestre足够公平。鉴于此问题未标记为apache,我发布此答案是为了让其他IIS用户(与我所处的情况类似)受益,他们可能会通过搜索引擎访问此页面。我赞成这样的观点,答案是对整个社区的利益,而不仅仅是OP。
Anthony Geoghegan

6

您可以随时使用

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

重定向到保存URL。

但是我建议通过.htaccess和Apache重写规则来实现。


13
我总是建议在重定向之前检查$ _SERVER ['HTTPS']。
拉斐尔·米歇尔

$ _SERVER ['HTTPS']并不总是设置,但是最好先检查一下。这就是为什么我建议使用Apache中有用的重写规则来执行此操作的原因,该规则仅在不使用HTTPS时才进行重定向。
powtac 2011年

尽管Apache建议不要使用额外的.htaccess文件(因为它会降低速度),但要在Apache * .conf中使用重写规则。
powtac

1

在我的AWS beantalk服务器上,没有看到$ _SERVER ['HTTPS']变量。我确实看到$ _SERVER ['HTTP_X_FORWARDED_PROTO']可以是'http'或'https',因此,如果您托管在AWS上,请使用以下命令:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.