以编程方式确定连接是通过HTTP还是HTTPS进行的?

3

我想将我的网站用户从 http://mysite 重定向到 https://mysite

我如何在PHP中以编程方式实现这一点?

4个回答

7

您可以使用if(!empty($_SERVER['HTTPS']))检查是否使用了SSL。

如果您正在使用标准端口,测试$_SERVER['SERVER_PORT'] == 443也可以工作,但是检查是否使用了HTTPS比测试端口是否为默认的SSL端口更好。


然而,重定向不应该通过PHP完成,而应该通过.htaccess(如果您正在使用Apache)完成:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

2

如果是https,那么变量$_SERVER['HTTPS']将被设置为非零值:

if (isset($_SERVER['HTTPS'])) {
    # it's https
} else {
    # it's not https
}

当未使用SSL时,$_SERVER['HTTPS']不存在,这将引发E_NOTICE。请使用isset()!empty() - ThiefMaster

2
如果$_SERVER['HTTPS']设置为on,则页面通过https加载。但是,您应该将cookie标记为安全,可以使用setcookie的一个参数来完成。如果cookie不安全,则可能通过未加密的http传输,并且即使用户立即重定向,它们也可能被窃取。

http://php.net/manual/en/function.setcookie.php

对于实际的重定向,我建议使用 .htaccess 重写而不是 PHP。创建一个 .htaccess 文件,其中包含以下内容。
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteCond ^(.*)$ https://www.example.com/$1 [R=301,L]

我只使用会话cookie。我应该将其标记为安全吗? - isekaijin
我需要把.htaccess文件保存在哪里? - isekaijin
在网站根目录(顶层)中,还要确保该文件以点号开头。 - nitro2k01
那个 php_ini 调用能否被实际设置在我的 php.ini 文件中替代? - isekaijin
当然可以。但是现在不能访问php.ini文件已经成为规则而不是例外,所以我给你提供了一个安全的选择。 - nitro2k01
显示剩余2条评论

2

使用$_SERVER['HTTPS']来确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接