Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode

Как в 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;