HTTP HTTPS URI URL URN

Протоколы HTTP, HTTPS и URI, URL, URN адреса реруса.
По протоколу HTTP или HTTPS идет запрос, а по адресу URI или URL получаем местонахождение и если есть тело, ресурс сайта.
В чем разница между HTTP и HTTPS?
HTTP - Hyper Text Transfer Protocol. Протокол Передачи Гипертекста. Предлагает набор правил и стандартов, которые регулируют способ передачи любой информации во Всемирной паутине. HTTP предоставляет стандартные правила для взаимодействия веб-браузеров и серверов.
HTTPS — Hyper Text Transfer Protocol Secure. Тоже что и http только Secure-Безопасный, защищенный протокол передачи гипертекста. Для коммуникации данных используется 443-ий порт. Данный протокол позволяет обеспечить безопасность транзакций путем шифрования всего трафика с помощью SSL. Это комбинация протокола SSL/TLS и HTTP. Обеспечивает зашифрованную и безопасную идентификацию сетевого сервера. Он обеспечивает двунаправленную безопасность данных. Это помогает защитить потенциально конфиденциальную информацию от кражи.
Разница между двумя протоколами HTTP и HTTPS, по сути только в стандартном и защищенном способе передачи данных.
При запросе адреса сайта социального портала, браузер отправляет запрос. Пример
GET / HTTP/1.1 // по какому методу и протоколу идет запрос
Host: socport.ru // определяет адрес домена, который запрашивает браузер
И получает ответ
- URL-адрес запроса: https://socport.ru/ // адрес сайта
- Метод запроса: GET // Метод, которым запрошен контент;
- Код состояния: 200 // сервер работает, документ найден
- Удаленный адрес: 84.64.231.418:443 // ip и порт HTTPS
В этом примере код ответа — 200, что означает: сервер работает, документ найден и будет передан клиенту. Но не всегда всё идет гладко.
Например, запрошенный документ может отсутствовать или сервер будет перегружен, в таком случае клиент не получит контент, а код ответа будет отличным от 200.
- 404 — если сервер доступен, но запрошённый документ не найден;
- 503 — если сервер не может обрабатывать запросы по техническим причинам.
Спецификация HTTP 1.1 определяет 40 различных кодов HTTP.
К примеру дадим ответ 503. Запишем функцию header, дальше протокол, версия протокола 1.1 и код Сервер Недоступен. Вы можете найти все коды состояния HTTP в поисковике.
header('HTTP/1.1 503'); // Код состояния: 503 Service Unavailable header('HTTP/1.1 304'); // объект не изменялся. Команда браузеру взять из кеша
Работа с заголовками в PHP
В PHP есть все возможности для взаимодействия с протоколом HTTP:
- Получение тела запроса;
- Получение заголовков запроса;
- Добавление/изменение заголовков ответа;
- Управление телом ответа.
Напомним ещё раз, что заголовки запроса — это мета-информация, отправленная браузером при запросе сценария.
PHP автоматически извлекает такие заголовки и помещает их в специальный массив- $_SERVER
Стоит отметить, что в этом массиве, помимо заголовков, есть и другая информация. Значения заголовков запроса находятся под ключами, которые начинаются с HTTP_
Подробно всё содержимое этого массива описано в официальной документации.
Выведем при помощи массива $_SERVER и индекса HTTP_USER_AGENT, данные пользователя запросившего адрес сайта.
echo $_SERVER['HTTP_USER_AGENT'];
И мы увидим такой же заголовок запроса, как и в меню браузера (Другие инструменты, Средства разработчика, Сеть, Все, Заголовки запроса, User-Agent:)

Узнать айпи пользователя который просматривает страницу или порт, так же можно через глобальный массив $_SERVER. Пример
echo '<p>' . $_SERVER['REMOTE_ADDR']; // айпи пользователя
<p> echo '<p>' . $_SERVER['REMOTE_PORT']; // порт</p>
Для примера создадим два файла: test1.php и test2.php
Запишем в test2.php ссылку
echo "<a href='test1.php'>Ссылка на тест 1 </a>";
а в test1.php запишем для примера массив 'HTTP_REFERER', из которого узнаем с какой страницы перешел пользователь.
print 'пользователь перешел с ' . ($_SERVER['HTTP_REFERER']);
echo '<p> Это страница тест1, на которую должен перейти пользователь с тест2 ';
При нажатии на ссылку в файле тест2, мы перешли на тест1 с записью адреса страницы в массиве.
Работа с заголовками.
Управлять всеми заголовками ответа, которые попадут к пользователю вместе с контентом страницы можно средствами PHP.
Вот примеры сценариев, когда пригодится управление заголовками ответа:
- Кэширование;
- Переадресация пользователя;
- Установка cookies;
- Отправка файлов;
- Передача дополнительной информации браузеру.
Заголовки ответа нужны для выполнения множества важных задач.
В PHP есть функция для отправки или смены заголовков: header()
Она принимает имя и значение заголовка и добавляет его в список из всех заголовков, которые уйдут в браузер пользователя после окончания работы сценария.
В заголовках откликов мы получаем тип страницы и кодировку.
content-type: text/html; charset=UTF-8 // тип html кодировка UTF-8
если необходимо отобразить страницу, как видит ее браузер то вместо html запишите plain
header("Content-type: text/plain"); // в этом случае отобразиться страница со всеми тегами.
Таким же образом можно дать команду сохранить ее в формате txt или pdf.
header("Content-type: application/txt"); // сохранить в txt
Задать название файла сохраняемой страницы. Пример
header('Content-Disposition: attachment; filename="socport_file.txt"');
Задать кодировку можно в заголовке php. Пример
header("Content-Type: text/html; charset=utf-8");
header("Content-type: text/html; Charset=windows-1251");
Переадресация страницы
Запишем в test1.php функцию header c заголовком Refresh, задержкой 5 секунд перед переадресацией и адресом страницы тест2 куда, перенаправить нас обратно на тест2 через 5 секунд.
header("Refresh: 5; url=/test2.php"); // перейти через 5сек. по адресу
Проверим. Если нам не нужна пауза то можно сразу записать заголовком Location
header("Location: /test2.php"); //все равно что вы уже на странице тест2
За переадресацию отвечает заголовок с именем Location, а через двоеточие задаётся значение — адрес страницы для перехода, если ресурс вшений то пишем весь путь URL, http://socport.ru/test2.php.
Таким же образом можно использовать для редиректа переменную вместо адреса. Естественно объявленная переменная должна быть перед вызовом. Пример
$per = '/test2.php'; // в переменную записали адрес
header("Refresh: 5; $per"); // редирект через 5 секунд, вместо адреса переменная
Важное замечание по использованию заголовков в версиях до php-8.
Заголовки нельзя отправлять, если пользователю к этому моменту уже отправили любой контент. То есть, если показать что-то на экране или даже поставить пробел перед открывающимся тегом php, то после этого заголовки поменять уже не получится.
После редиректа принято ставить выход из функции,
exit; // или die;
если будет присутствовать какой либо код ниже, он не продолжил выполнятся после перехода.
Управление телом ответа
Всё, что PHP выводит на экран, является содержимым ответа. Иными словами, вызовы функции
print, echoили показ текста через теги являются телом ответа, которое попадает в браузер пользователю.
Кешировать страницу, функция header.
Управлять кешированием можно на стороне сервера и через заголовок в php используя функцию header. Управление идет через поля заголовка Cache-Control и Pragma.
Если мы хотим чтобы одна страница на сайте была кеширована определенное время, то добавляем функцию с полями.
header('Cache-Control: max-age=259200')
header("Pragma: max-age=259200");
И в этих же полях прописываем запрет на кеширование, не кешировать
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // дата, после которой содержимое ресурса устареет
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // дата последнего обновления ресурса, всегда модифицируется
header('Cache-Control: post-check=0,pre-check=0', false); header('Cache-Control: max-age=0', false); header('Cache-Control: no-store, no-cache, must-revalidate'); // запретить кэширование, и каждый раз запрашивать ресурс с сервера. header('Pragma: no-cache'); // </p>
Pragma, данное поле считается устаревшим, но в некоторых случаях приходится использовать именно его. В частности некоторые proxy-сервера неправильно обрабатывают запросы к постоянно изменяющимся ресурсам, если вместе с ресурсом не передается данное поле заголовка.

Параметры запроса
Мы привыкли, что на нашем сайте каждый PHP-сценарий отвечает за одну страницу. Посетитель сайта вводит в адресную строку путь, который состоит из имени домена и имени PHP-сценария.
URI URL URN

Что обозначают эти аббревиатуры? Примеры
- URI — Uniform Resource Identifier (унифицированный идентификатор ресурса)
- URI – имя и адрес ресурса в сети, включает в себя URL и URN
- http://socport.ru/ya_i/web-it/programmirovanie/jaz...
Мы видим адрес сайта URL. пользователи, идентификатор пользователя и страница его активности, и все это и есть URI + может быть URN
URL — Uniform Resource Locator (унифицированный определитель местонахождения ресурса) URL – адрес ресурса в сети, определяет местонахождение и способ обращения к нему
http://socport.ru/ya_i/web-it/programmirovanie/jaz...
- URN — Unifrorm Resource Name (унифицированное имя ресурса)
- URN – имя ресурса в сети, определяет только название ресурса, но не говорит как к нему подключиться
- urn:
Например:
urn:isbn:50523 для идентификации книги по номеру ISBN.
URI содержит в себе следующие части:
- Схема (scheme) — показывает на то, как обращаться к ресурсу, чаще всего это сетевой протокол (http, ftp, ldap)
- Иерархическая часть (hier-part) — данные, необходимые для идентификации ресурса (например, адрес сайта)
- Запрос (query) — необязательные дополнительные данные ресурса (например, поисковой запрос)
- Фрагмент (fragment) – необязательный компонент для идентификации вторичного ресурса ресурса (например, место на странице)
Передать в редиректе заголовок методом GET и принять его.
В тест1 создадим переменную mir и с значением Privet Mir. В нашу ссылку редиректа добавим GET параметр с именем get, имя можно выбрать любое и в него добавим переменную мир.
$mir = 'Privet Mir'; // создали переменную
header("Refresh: 5; $per?get=$mir"); // дописали в URL за переменной с адресом, гет параметр ?имя=переменная. header("Refresh: 4; /test2.php?get=Privet Mir"); // или просто передать все URL
Принимаем его на странице тест2
echo $_GET['get'];
Или к примеру условие, если нет передан гет то, Нажмите на ссылку.
if (!isset($_GET['get'])) { // если нет параметра гет
$_GET['get'] = 'Нажмите на ссылку'; // выводим текст
} echo $_GET['get']; // в случае перехода выводим параметр переданный гет
Остальные команды для ответа вы сможеет найти в яндексе.