使用PHP来检查页面是否被SSL访问

有没有办法检查当前页面是否用SSL打开? 例如,我想让我的login页面(login.php)检查是否使用SSL访问(https://mywebserver.com/login.php)。 如果不是,则将其redirect到页面的SSL版本。

很多,我想在用户安全地使用页面之前。

你应该能够检查$_SERVER['HTTPS']是否被设置,例如:

 if (empty($_SERVER['HTTPS'])) { header('Location: https://mywebserver.com/login.php'); exit; } 

小心。 在我的IIS服务器上,$ _SERVER ['HTTPS']不为空,但值为'off'。

所以我必须这样做

 if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') { // no SSL request } 

如果您正在处理转发的协议,则会发现这可能无法正常工作。 例如,Amazon的ELB可以处理SSL协商,并通过端口80与您的应用服务器进行交互。

这个块处理:

  public function isSSL() { if( !empty( $_SERVER['https'] ) ) return true; if( !empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) return true; return false; } 
 <?php if ( !empty( $_SERVER['HTTPS'] ) ) { //do secure stuff }else{ //warn or redirect or whatever } ?> 

http://php.net/manual/en/reserved.variables.server.php

那么,这是另一个代码块。 该代码将返回完整的URL与https / http。

 <?php /** * Check whether URL is HTTPS/HTTP * @return boolean [description] */ function isSecure() { if ( ( ! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || ( ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || ( ! empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') ) { return true; } else { return false; } } /** * Example Use */ define('APP_URL', (isSecure() ? 'https' : 'http') . "://{$_SERVER['SERVER_NAME']}".str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME'])); echo APP_URL; /** * +++++++++++++++++++++++++ * OR - One line Code * +++++++++++++++++++++++++ */ define('APP_URL', ((( ! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || ( ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || ( ! empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') ) ? 'https' : 'http') . "://{$_SERVER['SERVER_NAME']}".str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME'])); echo APP_URL; ?> 

另一种方法是检查HTTPS cookie的存在。 首先,您的服务器需要使用secure标志向浏览器发送一个cookie:

 Set-Cookie:some_key=some_value;secure 

在服务器向浏览器发送cookie之后,只要浏览器从服务器请求页面,它就会在安全Cookie中发送some_key=some_value 仅当它请求HTTPS页面时。 这意味着如果你看到cookie的存在some_key=some_value你知道浏览器正在请求一个HTTPS页面。 瞧!

浏览器支持非常好,因为这是安全性的基础。 当用户请求来自非HSTSed域的页面时,不支持HTTPS cookie的浏览器是Firesheepable。

有关更多信息,请参阅:

只要补充一点,在nginx的情况下,检查https的方法是:

 if (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] === '443')) { return 'https'; }