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

问题描述:

我想将我的网站用户从http://mysite重定向到https://mysite以编程方式确定连接是通过HTTP还是通过HTTPS进行?

我该如何以PHP编程?

如果$_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] 
+0

我使用的唯一cookie是会话cookie。我是否应该将其标记为安全? – pyon 2011-03-21 22:31:28

+0

我在哪里必须保存'.htaccess'文件? – pyon 2011-03-21 22:34:40

+0

在网页根目录(顶层)。还要确保文件以句点开头。 – nitro2k01 2011-03-21 22:41:10

您可以使用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} 

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

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

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

这将引发'E_NOTICE'为'$ _SERVER ['HTTPS']'当SSL未使用时不存在。使用'isset()'或'!empty()' – ThiefMaster 2011-03-21 22:18:15

+0

@ThiefMaster - 非常正确。编辑。 – amphetamachine 2011-03-22 00:10:01