четверг, 17 января 2013 г.

Как в php узнать протокол (https)

Оказывается, узнать, что сайт использует SSL и страница открыта по протоколу https не настолько тривиальная задача, что бы решить ее с наскока.
Однако, решение оказалось достаточно простое.

Проблема заключается в том, что для определения протокола могут быть использованы переменные
$_SERVER['HTTPS']
$_SERVER['HTTP_SCHEME']
$_SERVER['HTTP_X_FORWARDED_PROTO']
И косвенно
$_SERVER['SERVER_PORT']
Но все эти переменные, кроме номера порта почти наверняка будут отсутствовать.
Определять http-схему основываясь только на номере порта -- приемлемое, но не очень гибкое решение.

Я сделал так:
$scheme = isset($_SERVER['HTTP_SCHEME']) ? $_SERVER['HTTP_SCHEME'] : (
     (
  (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ||
   443 == $_SERVER['SERVER_PORT']
     ) ? 'https' : 'http'
 
 );

И для надежности, что бы $_SERVER['HTTP_SCHEME'] была определена, в nginx.conf добавил строчку

# for SSL
fastcgi_param HTTP_SCHEME  $scheme;


Комментариев нет:

Отправить комментарий