使用PHP从HTTP重定向到HTTPS

Psy*_*che 96 php https

我正在购物车网站上工作,我希望在用户输入结算明细时将用户重定向到HTTPS页面,并保留下一页的HTTPS连接,直到他退出为止.

我需要在服务器上安装什么(我正在使用Apache)才能执行此操作,以及如何从PHP完成此重定向?

Rap*_*hel 227

尝试这样的事情(应该适用于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;
}
Run Code Online (Sandbox Code Playgroud)

  • 它总是不起作用.我尝试使用它并且$ _SERVER数组中没有'https'元素,因为它给出了"太多重定向"的错误.需要使用其他方法. (5认同)
  • 我必须测试`if($ _SERVER ['HTTPS'] =="off")`以使这段代码正常工作.我认为这是因为我在IIS上,而不是像OP那样的Apache. (5认同)
  • 注意:在标题重定向之后放置die()或exit()非常重要,以防止页面的其余部分执行(并可能向客户端发送额外信息)(即黑客或浏览器可能不尊重标题). (5认同)
  • 根据您的服务器环境/设置,您可能需要使用$ _SERVER ['HTTP_X_FORWARDED_PROTO']来检查http/https (3认同)
  • 这是否容易受到注入攻击?如果 `$_SERVER['REQUEST_URI']` 包含特殊字符,比如换行怎么办? (2认同)

小智 14

这是一个很好的方法:

<?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();
}
?>
Run Code Online (Sandbox Code Playgroud)

  • 效果很好,标记为好的会返回重定向太多次,至少在 Chrome 中 (4认同)

pow*_*tac 5

你可以随时使用

header('Location: https://www.domain.com/cart_save/');
Run Code Online (Sandbox Code Playgroud)

重定向到保存URL.

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

  • 我总是建议在重定向之前检查$ _SERVER ['HTTPS']. (13认同)

Ant*_*ica 5

在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();
}
?>
Run Code Online (Sandbox Code Playgroud)

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

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

pho*_*nix 5

在我的 AWS beanstalk 服务器上,我没有看到 $_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;
}
Run Code Online (Sandbox Code Playgroud)