Php http x forwarded proto

PHP определить https или http используется при подключении

Заголовок вышел немного корявый, но суть следующая — как на PHP определить по какому протоколу http или https выполняется текущее подключение к сайту. Это необходимо для тех скриптов, которые используют в своей работе тег , тогда все относительные ссылки будут подключатся по нужным протоколам.

Хотя в документации указано что можно проверять $_SERVER[‘HTTPS’] — все оказалось немного сложнее.

Вот полный сниппет, который у меня получился (точнее сниппет не совсем мой — когда я уже написал свой аналогичный, я нашел немного более красивый у разработчиков OkayCMS) и чуть ниже я расскажу почему именно так.

// Протокол $protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))=='https'? 'https' : 'http'; if($_SERVER["SERVER_PORT"] == 443) $protocol = 'https'; elseif (isset($_SERVER['HTTPS']) && (($_SERVER['HTTPS'] == 'on') || ($_SERVER['HTTPS'] == '1'))) $protocol = 'https'; elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') $protocol = 'https';

Вся проблема с корректным определением протокола в кеширующих прокси, (если использовать нативный Апач, то проблем обычно нету) в зависимости от конфигов в переменных может твориться все что угодно,

В первой строке определяется протокол $_SERVER[«SERVER_PROTOCOL»] , эта строка заполнена всегда, но в зависимости от конфига сервера там может быть http даже если подключение выполняется по https (да, бывает и такое), поэтому начальное значение берется оттуда.

Читайте также:  Push service in java

Далее проверяем порт, если это 443, то это точно https.

Далее если порт не такой, но в конфиге сервера указана переменная $_SERVER[‘HTTPS’], то будем надеяться что он таки не соврал и это таки https (тут есть один ньюанс, которого в сниппете нету для такого экзотического конфига как ISAPI + IIS, значение $_SERVER[‘HTTPS’] будет равно ‘off’, в случае обычного подключения, а что будет в случае https — я не знаю, т.к. проверить это не могу, просто учтите)

Ну и вишенка на тортике, это предпоследняя строка, если используются reverse proxy аля Cloudflare или хитро настроенный nginx, то все предыдущие строки будут бодро рапортовать о 80 порте и обычном подключении, а оказывается на самом деле все идет по защищенному протоколу, ибо $_SERVER[‘HTTP_X_FORWARDED_PROTO’] == ‘https’.

На это все, как видите определить http или https на php, не особо сложно, главное учесть все детали.

Источник

Массив $_SERVER

Описание значений глобального массива $_SERVER с примерами.

Параметры сервера

Имя хоста, обычно совпадает с доменом.

Название и версия сервера.

Версия сервера и имя виртуального хоста, обычно пуста.

Имя и версия используемого HTTP протокола.

Значение из директивы конфигурационного файла Apache.
На хостингах указывают контактный e-mail.

Параметры соединения

Имя сервера, как правило, совпадает с доменом.

IP-адрес, с которого пользователь просматривает текущую страницу.

64.246.37.238 fe80:0:0:0:200:f8ff:fe21:67cf

Удаленный хост, с которого пользователь просматривает текущую страницу.

Порт на удаленной машине, который используется для связи с веб-сервером.

Время запроса к серверу в Unix timestamp.

​Время запроса к серверу с точностью до микросекунд.

Пути на сервере

Директория корня сайта, в которой выполняется текущий скрипт.

/home/example.com/public_html

Появился в Apache2, то же самое что и DOCUMENT_ROOT .

Содержит путь, содержащийся после имени скрипта.
Например для адреса http://site.ru/index.php/123 значение будет следующим:

Исходное значение переменной PATH_INFO перед обработкой PHP.

Путь и имя выполняемого скрипта.

​Путь к исполняемому скрипту относительно корня сайта, обычно равен SCRIPT_NAME .

​Абсолютный путь к исполняемому скрипту.

/home/example.com/public_html/index.php

Авторизация на .htpasswd

Метод HTTP аутентификации.

$_SERVER[‘REMOTE_USER’] и $_SERVER[‘PHP_AUTH_USER’]

HTTPS

$_SERVER[‘HTTPS’] , $_SERVER[‘HTTP_X_HTTPS’] , $_SERVER[‘REDIRECT_HTTPS’]

URL

Значения в примерах приведены для адреса http://site.ru/index.php?page=1&sort=2

URI страницы с GET-параметрами, без домена.

Количество элементов массива $_SERVER[‘argv’] .

​Содержит URL страницы без GET-параметров и домена.

Заголовки браузера

Строка, обозначающая браузер и операционную систему, который открыл данную страницу.

Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36

Куки браузера в виде строки: ключ=значение; ключ=значение;.
Данные доступны в переменной $_COOKIE .

_ym_uid=xxx; _ym_d=xxx; PHPSESSID=xxx;

Адрес страницы, с которой браузер пользователя перешёл на текущую страницу.

Содержимое заголовка Accept из текущего запроса.

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

HTTP заголовок переданный клиентом, говорящий о том какие алгоритмы сжатия он может понять.

​Содержимое заголовка Accept-Language .

Предпочтения клиента относительно кодировки.

Значение заголовка Connection .

Браузер отправляет этот заголовок со значением 1 , выражающий предпочтение клиента для зашифрованного ответа.

Дамп переменной $ _SERVER

Для тестирования, значения массива $ _SERVER для разных клиентов можно скидывать в лог-файл:

file_put_contents(__DIR__ . '/server.log', print_r($_SERVER, true) . PHP_EOL, FILE_APPEND);

Источник

Редирект с HTTP на HTTPS в htaccess

Как настроить перенаправление с HTTP на HTTPS в PHP и .htaccess на разных хостингах.

Редирект в PHP

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") < $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; header('HTTP/1.1 301 Moved Permanently'); header('Location: ' . $location); exit; >

Timeweb

SetEnvIf X-HTTPS 1 HTTPS RewriteEngine On RewriteBase / RewriteCond % !1 RewriteRule ^(.*)$ https://%/$1 [R=301,L]

Masterhost

RewriteCond % !443 RewriteRule ^(.*)$ https://%/$1 [R=301,L]

nic.ru

RewriteCond % !on RewriteRule ^(.*)$ https://%/$1 [R=301,L]

reg.ru

RewriteCond % !^443$ RewriteRule ^(.*)$ https://%/$1 [R=301,L]

beget.com

RewriteCond % !=https RewriteRule .* https://%% [R=301,L]

sweb.ru

RewriteEngine on SetEnvIf X-Forwarded-Proto https SERVER_PORT=443 SetEnvIf X-Forwarded-Proto https HTTPS=on RewriteCond % !=on [NC] RewriteRule ^(.*)$ https://%% [R=301,L]

jino.ru

RewriteCond % !=https RewriteRule .* https://%% [R=301,L]

Sprinthost.ru

RewriteCond % !https RewriteRule ^ https://%% [L,R=301,NE]

Комментарии

Другие публикации

Как сделать редирект PHP

На страницах сайтов постоянно что-то добавляется, удаляется и обновляется, чтобы в поисковиках была только актуальная информация и нужные страницы не выпадали из поиска применяются редиректы.

Location – URL текущей страницы

Объект Location связан с адресной строкой браузера, в его свойствах содержатся все компоненты URL доступные для чтения.

CURL - если сервер отдает редирект

Бывает так что сервер перенаправляет на другой URL. Например Google, если перейти на https://google.com c IP из РФ он.

Переезд сайта на HTTPS

В последнее время вопрос переезда сайта с HTTP на HTTPS перешел из рекомендаций в необходимость, как со стороны поисковиков, так и браузеров.

Источник

Суперглобальная переменная $_SERVER

Переменная $_SERVER — это массив, содержащий информацию, такую как заголовки, пути и местоположения скриптов. Записи в этом массиве создаются веб-сервером.

Рассмотрим на примере как использовать суперглобальную переменную $_SERVER:

Пример

"; echo $_SERVER['SERVER_NAME']; echo "
"; echo $_SERVER['HTTP_HOST']; echo "
"; echo $_SERVER['HTTP_REFERER']; echo "
"; echo $_SERVER['HTTP_USER_AGENT']; echo "
"; echo $_SERVER['SCRIPT_NAME']; ?>

В приведенном выше коде мы использовали элементы $_SERVER для получения некоторой информации. Получаем имя текущего файла, над которым мы работаем с помощью элемента PHP_SELF . Затем получаем имя сервера, используемое в настоящее время с использованием элемента SERVER_NAME . А затем получаем имя хоста через HTTP_HOST . HTTP_REFERER — адрес страницы (если есть), с которой браузер пользователя перешёл на эту страницу.

Рассмотрим описание значений глобального массива $_SERVER с примерами.

Параметры сервера

Элемент Описание
$_SERVER[‘SERVER_NAME’] Имя хоста, обычно совпадает с доменом (например, wm-school.ru)
$_SERVER[‘GATEWAY_INTERFACE’] Версия Common Gateway Interface (CGI), которую использует сервер (CGI/1.1)
$_SERVER[‘SERVER_SOFTWARE’] Название и версия сервера (Apache/2.4.7)
$_SERVER[‘SERVER_SIGNATURE’] Версия сервера и имя виртуального хоста, обычно пуста
$_SERVER[‘SERVER_PROTOCOL’] Имя и версия используемого HTTP протокола (HTTP/1.1)
$_SERVER[‘SERVER_ADDR’] IP-адрес сервера (127.0.0.1)
$_SERVER[‘SERVER_PORT’] Порт сервера (80)
$_SERVER[‘SERVER_ADMIN’] Значение из директивы конфигурационного файла Apache. На хостингах указывают контактный e-mail.

Параметры соединения

Элемент Описание
$_SERVER[‘HTTP_HOST’] Имя сервера, как правило, совпадает с доменом (например, wm-school.ru)
$_SERVER[‘HTTP_PORT’] Порт подключения (80)
$_SERVER[‘REMOTE_ADDR’] IP-адрес, с которого пользователь просматривает текущую страницу (64.246.37.238)
$_SERVER[‘REMOTE_HOST’] Удаленный хост, с которого пользователь просматривает текущую страницу
$_SERVER[‘REMOTE_PORT’] Порт на удаленной машине, который используется для связи с веб-сервером
$_SERVER[‘REQUEST_SCHEME’] Схема запроса (http)
$_SERVER[‘REQUEST_METHOD’] Метод запроса к странице (GET, POST, PUT)
$_SERVER[‘REQUEST_TIME’] Время запроса к серверу в Unix timestamp (1537962596)
$_SERVER[‘REQUEST_TIME_FLOAT’] Время запроса к серверу с точностью до микросекунд (1537962596.892)

Пути на сервере

Элемент Описание
$_SERVER[‘DOCUMENT_ROOT’] Директория корня сайта, в которой выполняется текущий скрипт (например, /wm-school.ru/scripts)
$_SERVER[‘CONTEXT_DOCUMENT_ROOT’] Появился в Apache2, то же самое что и DOCUMENT_ROOT
$_SERVER[‘PATH_INFO’] Содержит путь, содержащийся после имени скрипта (Например для адреса https://wm-school.ru/index.php/123 значение будет следующим: /123)
$_SERVER[‘ORIG_PATH_INFO’] Исходное значение переменной PATH_INFO перед обработкой PHP
$_SERVER[‘SCRIPT_NAME’] Путь и имя выполняемого скрипта (/index.php)
$_SERVER[‘PHP_SELF’] ​Путь к исполняемому скрипту относительно корня сайта, обычно равен SCRIPT_NAME (/index.php)
$_SERVER[‘SCRIPT_FILENAME’] Абсолютный путь к исполняемому скрипту (/wm-school.ru/public_html/index.php)
$_SERVER[‘PATH’] /usr/local/bin:/usr/bin:/bin

Авторизация на .htpasswd

Элемент Описание
$_SERVER[‘AUTH_TYPE’] Метод HTTP аутентификации (например, Basic)
$_SERVER[‘REMOTE_USER’] и $_SERVER[‘PHP_AUTH_USER’] Логин пользователя
$_SERVER[‘PHP_AUTH_PW’] Пароль

HTTPS

Данные переменные появляются при HTTPS соединении:

$_SERVER[‘HTTPS’], $_SERVER[‘HTTP_X_HTTPS’], $_SERVER[‘REDIRECT_HTTPS’]

URL

Значения в примерах приведены для адреса https://wm-school.ru/index.php?page=1&exercise=2

Заголовки браузера

Элемент Описание
$_SERVER[‘HTTP_USER_AGENT’] Браузер и операционную система, открышие данную страницу (например, Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36)
$_SERVER[‘HTTP_COOKIE’] Куки браузера в виде строки: ключ=значение; ключ=значение;. Данные доступны в переменной $_COOKIE (_ym_uid=xxx; _ym_d=xxx; PHPSESSID=xxx;)
$_SERVER[‘HTTP_REFERER’] Адрес страницы, с которой браузер пользователя перешёл на текущую страницу (https://wm-school.ru/index.php)
$_SERVER[‘HTTP_ACCEPT’] Содержимое заголовка Accept из текущего запроса (text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */*; q=0.8)
$_SERVER[‘HTTP_ACCEPT_ENCODING’] ​HTTP заголовок переданный клиентом, говорящий о том какие алгоритмы сжатия он может понять (gzip, deflate)
$_SERVER[‘HTTP_ACCEPT_LANGUAGE’] ​Содержимое заголовка Accept-Language (ru-RU,ru; q=0.9,en-US; q=0.8,en; q=0.7)
$_SERVER[‘HTTP_ACCEPT_CHARSET’] ​Предпочтения клиента относительно кодировки (utf-8, iso-8859-1)
$_SERVER[‘HTTP_CACHE_CONTROL’] ​max-age=0
$_SERVER[‘HTTP_UPGRADE_ INSECURE_REQUESTS’] ​Браузер отправляет этот заголовок со значением 1, выражающий предпочтение клиента для зашифрованного ответа

Дамп переменной $_SERVER

Для тестирования, значения массива $_SERVER для разных клиентов можно скидывать в лог-файл:

file_put_contents(__DIR__ . '/server.log', print_r($_SERVER, true) . PHP_EOL, FILE_APPEND);

Источник

Оцените статью