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']; // в случае перехода выводим параметр переданный гет
Остальные команды для ответа вы сможеет найти в яндексе.