Django / Grade 1 / Основные понятия Django

HTTP Протокол


HTTP — это набор правил для передачи файлов: текста, изображений, звука, видео и других мультимедиа. HTTP работает поверх набора протоколов TCP/IP, которые составляют основу интернета.

В HTTP-протоколе есть две разные роли: сервер и клиент. Запрос всегда инициирует клиент, а сервер на него отвечает. Клиентом может быть как браузер, так и, к примеру, поисковый робот, который просматривает страницы в интернете и индексирует их согласно релевантности ключевого запроса. HTTP основан на тексте — сообщения между клиентом и сервером по сути представляют собой фрагменты текста, хотя в теле сообщения могут быть другие элементы: видео, фото, аудио и т.д.

Каждый отдельный запрос отправляется на сервер, который обрабатывает его и предоставляет ответ. Между клиентом и сервером существует множество объектов, которые называются прокси-серверами. Они  обеспечивают различные уровни функциональности, безопасности и конфиденциальности в зависимости от ваших потребностей или политики компании.

 HTTP содержит три основных элемента:

Клиент

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

Веб-сервер

На другой стороне канала связи находится сервер, который обслуживает документ по запросу клиента. Хотя для пользователя сервер выглядит как одна виртуальная машина, на самом деле это может быть набор серверов, разделяющих нагрузку. С другой стороны, несколько серверов могут быть расположены на одной и той же машине. При HTTP/1.1 и заголовке Host они могут даже использовать один и тот же IP-адрес.

Прокси

Прокси-серверы — это серверы, компьютеры или другие машины уровня приложений, которые находятся между клиентским устройством и непосредственно сервером. Они ретранслируют HTTP-запросы и ответы. Обычно для каждого взаимодействия клиент-сервер используется один или несколько прокси.

Веб-разработчики могут использовать прокси для следующих целей:

Как работает HTTP-протокол

Шаг первый: направляем URL в браузер.
Когда мы хотим посмотреть веб-страницу, мы можем использовать разные типы девайсов: ноутбук, стационарный компьютер или телефон. Главное, чтобы на устройстве было приложение браузера. Пользователь либо вводит унифицированный указатель ресурса (URL) в поисковую строку браузера, либо переходит по ссылке с уже открытой страницы:

URL-адрес начинается с HTTP. Это сигнал браузеру, что ему необходимо использовать HTTP-протокол для получения документа по этому адресу.

Шаг второй: браузер ищет нужный IP-адрес.
Обычно IP-адреса содержат удобные и читабельные для человека названия доменов, например «highload.today» или «wikipedia.org». Браузер использует преобразователь DNS для сопоставления домена с IP-адресом.

Шаг третий: браузер посылает HTTP-запрос.

Как только браузер определяет IP-адрес компьютера, на котором размещен запрошенный URL, он отправляет HTTP-запрос.

HTTP-запрос может состоять всего из двух строк текста:

GET/index.html HTTP/1.1
Host: www.example.com

Первое слово — это 

GET

. С его помощью мы показываем, что хотим получить информацию. Следующая часть указывает путь: 

/index.html

. Главный компьютер хранит содержимое всего веб-сайта, поэтому необходимо прописать, какую именно страницу нужно загрузить. Последняя часть первой строки указывает протокол и версию протокола: «HTTP/ 1.1». Во второй строке указывается домен запрошенного URL.

Кроме 

GET

 в HTTP-протоколе существует еще два вида запросов. Разберем их отличия:

Шаг четвертый: сервер отправляет HTTP-ответ.

Как только хост-компьютер получает HTTP-запрос, он отправляет клиенту ответ с содержанием и метаданными.

HTTP-ответ начинается аналогично запросу:

HTTP/1.1 200 ОК

Ответ начинается с указания версии HTTP-протокола — 1.1. Следующее число — это код статуса HTTP, в примере это число 200. Этот код значит, что запрашиваемый документ был успешно извлечен.

Следующая часть ответа HTTP — это заголовки. Они предоставляют браузеру дополнительные сведения и помогают ему отображать контент. Эти два заголовка являются общими для большинства запросов:

Content-Type: text/html; charset=UTF-8
Content-Length: 208

Content-type

 сообщает браузеру, какой тип документа он отправляет обратно. Самый распространенный тип документа в интернете — это 

text/html

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

Content-length

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

Кроме кода 200, в случае если загрузка страницы прошла успешно, есть еще несколько статусов:

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

Основные характеристики HTTP-протокола

Есть три основные особенности, которые делают HTTP простым, но мощным протоколом.

  1. HTTP-клиент, то есть браузер, инициирует HTTP-запрос и после этого ожидает ответ. Сервер обрабатывает запрос и отправляет ответ, после чего соединение прерывается. Получается, что клиент и сервер знают друг о друге только во время текущей сессии. Дальнейшие запросы выполняются уже при новом подключении, а клиент и сервер будут новыми друг для друга.
  2. HTTP не зависит от носителя. Любой тип данных может быть отправлен по HTTP, если и клиент и сервер знают, как обрабатывать его содержимое. От клиента и сервера требуется только указать тип контента, используя соответствующий MIME-тип.
  3. HTTP не имеет состояния (stateless). Как уже говорилось выше, HTTP не поддерживает постоянное соединение и поэтому HTTP является протоколом без состояния. Сервер и клиент знают друг друга только во время текущего запроса. Из-за такого характера протокола ни клиент, ни браузер не могут сохранять информацию между различными запросами.

HTTP-протокол — простой, но многофункциональный

пример запроса к django.help

GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Cookie: csrftoken=utn77LjVJtl8DzlrZjLf0LzOE25qCJmA; sessionid=uifw8w20qcycrhsvdoulmmwgpszmpafb
DNT: 1
Host: django.help
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"

Давайте разберем каждый из заголовков в предоставленном HTTP-запросе:

1. **Request Line (Строка запроса):**
- **Method:** `GET` - это HTTP-метод запроса, который указывает серверу, какое действие нужно выполнить.
- **Path:** `/` - это путь ресурса, который запрашивается на сервере.
- **HTTP Version:** `HTTP/1.1` - это версия протокола HTTP, которую использует браузер.


2. **Общие заголовки (Common Headers):**
- *Cache-Control:* `max-age=0` - указывает серверу, что клиент не хочет использовать кэшированные версии ресурса.
- *Connection:* `keep-alive` - указывает, что соединение с сервером должно быть установлено и поддерживаться после завершения текущего запроса.


3. **Заголовки запроса (Request Headers):**
- *Accept:* `text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7` - сообщает серверу, какие типы контента может обрабатывать браузер, и их предпочтения по качеству.
- *Accept-Encoding:* `gzip, deflate, br` - указывает, какие методы сжатия данных поддерживаются браузером.
- *Accept-Language:* `ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7` - определяет предпочтительные языки для предоставления контента.
- *Cookie:* `csrftoken=utn77LjVJtl8DzlrZjLf0LzOE25qCJmA; sessionid=uifw8w20qcycrhsvdoulmmwgpszmpafb` - содержит куки, отправленные серверу с предыдущими запросами. Куки используются для отслеживания состояния сеанса.
- *DNT (Do Not Track):* `1` - указывает, что пользователь предпочитает не быть отслеженным (это не гарантирует, что сервер будет следовать этому).


4. **Sec-Fetch-Headers:**
- *Sec-Fetch-Dest:* `document` - указывает серверу, что ожидается получение документа в ответе.
- *Sec-Fetch-Mode:* `navigate` - указывает, что запрос связан с навигацией пользователя (например, переход по ссылке).
- *Sec-Fetch-Site:* `none` - указывает, что запрос происходит не с другого сайта (cross-site), а с текущего сайта.
- *Sec-Fetch-User:* `?1` - указывает, что браузер отправляет данные пользователя с запросом.


5. **Upgrade-Insecure-Requests:** `1` - указывает серверу об использовании HTTPS вместо HTTP, если это возможно.


6. **User-Agent:** `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36` - содержит информацию о браузере и операционной системе, которую сервер может использовать для определения оптимального варианта контента.


7. **Sec-Ch-UA:**
- *sec-ch-ua:* `"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"` - указывает серверу о версии и характеристиках браузера.


8. **Sec-Ch-UA-Mobile:** `?0` - указывает, что браузер не является мобильным.


9. **Sec-Ch-UA-Platform:** `"macOS"` - указывает серверу на операционную систему пользователя.
Каждый из этих заголовков предоставляет серверу дополнительную информацию о запросе и предпочтениях браузера для обработки и предоставления контента.


Содержимое REQUEST

Функции-представления в качестве обязательного параметра получают объект HttpRequest, который хранит информацию о запросе. HttpRequest определяет ряд атрибутов, которые хранят информацию о запросе. Выделим следующие из них:

Также HttpRequest определяет ряд методов. Отметим следующие из них:

Например, получим некоторую информацию о запросе. Для этого в файле views.py:

1
2
3
4
5
6
7
8
9
10
11
12
from django.http import HttpResponse
 
def index(request):
    host = request.META["HTTP_HOST"] # получаем адрес сервера
    user_agent = request.META["HTTP_USER_AGENT"]    # получаем данные бразера
    path = request.path     # получаем запрошенный путь
     
    return HttpResponse(f"""
        <p>Host: {host}</p>
        <p>Path: {path}</p>
        <p>User-agent: {user_agent}</p>
    """)

В данном случае получаем два заголовка "HTTP_HOST" и "HTTP_USER_AGENT" и запрошенный путь.

В файле urls.py зарегистрируем данную функцию:

1
2
3
4
5
6
from django.urls import path
from hello import views
 
urlpatterns = [
    path("index", views.index),
]

Результат работы:

HttpRequest и получение данных запроса в веб-приложении на Django и python



HTTP — широко распространённый протокол передачи данных, изначально предназначенный для передачи гипертекстовых документов 

напишем запрос в ручную (на виндовс: telnet)

nc django.help 80

или

curl -v http://django.help


Стартовая (начальная) строка запроса для HTTP 1.1 составляется по следующей схеме:
Метод URI HTTP/Версия

GET / HTTP/1.1
Host: django.help

Стартовая строка ответа имеет следующую структуру:

HTTP/Версия Код состояния Пояснение

Версия протокола здесь задаётся так же, как в запросе.

Код состояния (Status Code) — три цифры (первая из которых указывает на класс состояния), которые определяют результат совершения запроса. Например, в случае, если был использован метод GET, и сервер предоставляет ресурс с указанным идентификатором, то такое состояние задаётся с помощью кода 200. Если сервер сообщает о том, что такого ресурса не существует — 404. Если сервер сообщает о том, что не может предоставить доступ к данному ресурсу по причине отсутствия необходимых привилегий у клиента, то используется код 403. Спецификация HTTP 1.1 определяет 40 различных кодов HTTP, а также допускается расширение протокола и использование дополнительных кодов состояний.

Пояснение к коду состояния (Reason Phrase) — текстовое (но не включающее символы CR и LF) пояснение к коду ответа, предназначено для упрощения чтения ответа человеком. Пояснение может не учитываться клиентским программным обеспечением, а также может отличаться от стандартного в некоторых реализациях серверного ПО.

После стартовой строки следуют заголовки, а также тело ответа. Например:

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Sat, 08 Mar 2014 22:53:46 GMT
Content-Type: application/octet-stream
Content-Length: 7
Last-Modified: Sat, 08 Mar 2014 22:53:30 GMT
Connection: keep-alive
Accept-Ranges: bytes

Wisdom


Сам по себе протокол HTTP не предполагает использование шифрования для передачи информации. Тем не менее, для HTTP есть распространённое расширение, которое реализует упаковку передаваемых данных в криптографический протокол SSL или TLS.

Название этого расширения — HTTPS (HyperText Transfer Protocol Secure). Для HTTPS-соединений обычно используется TCP-порт 443. HTTPS широко используется для защиты информации от перехвата, а также, как правило, обеспечивает защиту от атак вида man-in-the-middle — в том случае, если сертификат проверяется на клиенте, и при этом приватный ключ сертификата не был скомпрометирован, пользователь не подтверждал использование неподписанного сертификата, и на компьютере пользователя не были внедрены сертификаты центра сертификации злоумышленника.



На данный момент HTTPS поддерживается всеми популярными веб-браузерами.

Протокол HTTP предполагает достаточно большое количество возможностей для расширения. В частности, спецификация HTTP 1.1 предполагает возможность использования заголовка Upgrade для переключения на обмен данными по другому протоколу. Запрос с таким заголовком отправляется клиентом. Если серверу требуется произвести переход на обмен данными по другому протоколу, то он может вернуть клиенту ответ со статусом «426 Upgrade Required», и в этом случае клиент может отправить новый запрос, уже с заголовком Upgrade.

Такая возможность используется, в частности, для организации обмена данными по протоколу WebSocket (протокол, описанный в спецификации RFC 6455, позволяющий обеим сторонам передавать данные в нужный момент, без отправки дополнительных HTTP-запросов): стандартное «рукопожатие» (handshake) сводится к отправке HTTP-запроса с заголовком Upgrade, имеющим значение «websocket», на который сервер возвращает ответ с состоянием «101 Switching Protocols», и далее любая сторона может начать передавать данные уже по протоколу WebSocket.


Цикл - запрос ответ

Request URL:
https://django.help/
Request Method:
GET
Status Code:
200 OK
Remote Address:
84.38.180.167:443
Referrer Policy:
strict-origin-when-cross-origin

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Fri, 12 Jan 2024 08:58:42 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: DENY
Vary: Cookie
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
Set-Cookie: csrftoken=utn77LjVJtl8DzlrZjLf0LzOE25qCJmA; expires=Fri, 10 Jan 2025 08:58:42 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Content-Encoding: gzip

GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Cookie: csrftoken=utn77LjVJtl8DzlrZjLf0LzOE25qCJmA; sessionid=uifw8w20qcycrhsvdoulmmwgpszmpafb
DNT: 1
Host: django.help
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"


Когда вы вводите доменное имя (например, "www.example.com") в адресной строке браузера и нажимаете Enter, браузер выполняет следующие шаги, чтобы узнать IP-адрес для данного доменного имени:

  1. Локальное кэширование: Браузер проверяет свой локальный кэш DNS, который содержит предыдущие запросы DNS. Если для данного доменного имени уже есть запись в кэше, браузер может использовать сохраненный IP-адрес без выполнения запроса на DNS-сервер.

  2. Операционная система: Если в локальном кэше нет соответствующей записи, браузер обращается к операционной системе для получения IP-адреса. Операционная система может содержать свой кэш DNS, который также может содержать предыдущие запросы.

  3. DNS-запрос: Если IP-адрес не найден в локальном кэше операционной системы, браузер отправляет DNS-запрос на удаленный DNS-сервер. Этот запрос содержит доменное имя, для которого нужно узнать IP-адрес.

  4. DNS-сервер: Запрос достигает DNS-сервера, ответственного за разрешение данного доменного имени. DNS-сервер возвращает IP-адрес, связанный с этим доменом.

  5. Кэширование результатов: Браузер кэширует полученный IP-адрес на некоторое время. Это сделано для улучшения производительности и снижения задержек при последующих запросах к тому же домену.

Таким образом, браузер узнает IP-адрес, выполнив запрос к DNS-серверу, ответственному за разрешение данного доменного имени. Весь этот процесс обеспечивает соответствие доменных имен реальным IP-адресам серверов, с которыми браузер будет устанавливать соединение для получения запрошенных ресурсов.




https://selectel.ru/blog/http-request/


  1. Accept:

    Этот заголовок указывает, какие типы контента (MIME-типы) клиент может принять в ответ на запрос. В данном случае, клиент говорит, что он может принимать HTML, XHTML и XML с более низким приоритетом для других форматов.


  2. Accept-Encoding:

    Этот заголовок указывает, какие методы сжатия контента клиент может принять. В данном случае, клиент говорит, что он может принимать сжатие с использованием gzip, deflate и br (Brotli).


  3. Accept-Language:

    Этот заголовок указывает предпочтительные языки клиента для контента. В данном случае, клиент указывает, что его предпочтительный язык - русский.


  4. Cookie:

    Этот заголовок содержит информацию о куках, которые были установлены на клиенте и отправляются на сервер. В данном случае, он содержит куки с именем "csrftoken" и "abuse_interstitial" с их значениями.


  5. Host:

    Этот заголовок указывает имя хоста, к которому отправлен запрос. В данном случае, запрос отправляется на хост "30ba-5-34-1-20.ngrok-free.app".


  6. Referer:

    Этот заголовок указывает на URL страницы, с которой пришел запрос. В данном случае, запрос происходит с реферера "https://30ba-5-34-1-20.ngrok-free.app/".


  7. User-Agent:

    Этот заголовок содержит информацию о браузере или клиенте, который отправляет запрос. В данном случае, клиентом является браузер Safari на операционной системе Mac OS X.


  8. X-Forwarded-For:

    Этот заголовок часто используется при проксировании запросов через промежуточные серверы (например, при использовании облачных сервисов). Он указывает на исходный IP-адрес клиента, который может быть полезным для отслеживания клиентского IP-адреса.


  9. X-Forwarded-Host:

    Этот заголовок также может быть использован при проксировании запросов. Он указывает на исходное имя хоста клиента.


  10. X-Forwarded-Proto:

    Этот заголовок указывает на протокол, используемый клиентом при отправке запроса. Например, "https" означает, что запрос был отправлен по защищенному HTTPS-протоколу.





    1. Content-Length:

      Этот заголовок указывает длину (в байтах) тела ответа. В данном случае, длина составляет 25 048 байт.


    2. Content-Type:

      Этот заголовок определяет тип контента, который отправляется в ответ. В данном случае, это HTML-контент с кодировкой UTF-8.


    3. Cross-Origin-Opener-Policy:

      Этот заголовок управляет политикой безопасности межсайтового доступа (CORS) для окна и рабочего процесса. В данном случае, он установлен на "same-origin", что означает, что документ может быть открыт только в том же источнике.


    4. Date:

      Этот заголовок указывает дату и время, когда ответ был сгенерирован сервером. В данном случае, ответ был сгенерирован 6 ноября 2023 года в 14:53:39 GMT.


    5. Referrer-Policy:

      Этот заголовок указывает, какие сведения о реферере (предыдущей странице) следует включать в запросы к текущему ресурсу. В данном случае, он установлен на "same-origin", что означает, что реферер будет отправлен только на ресурсы с тем же источником.


    6. Server:

      Этот заголовок указывает информацию о сервере, который обрабатывает запрос. В данном случае, сервером является WSGIServer версии 0.2 на CPython 3.11.3.


    7. Set-Cookie:

      Этот заголовок устанавливает куки на клиенте. В данном случае, он устанавливает куки с именем "csrftoken" и указывает их срок действия, путь и политику SameSite.


    8. Vary:

      Этот заголовок указывает, какие заголовки запроса были использованы при выборе контента для ответа. В данном случае, он указывает "Cookie", что означает, что ответ зависит от заголовка Cookie в запросе.


    9. X-Content-Type-Options:

      Этот заголовок управляет определением типа контента браузером. В данном случае, он установлен на "nosniff", что предотвращает браузер от попытки определить тип контента, если тип не был явно указан.


    10. X-Frame-Options:

      Этот заголовок определяет, может ли ресурс быть вложен в <iframe>. В данном случае, он установлен на "DENY", что предотвращает вложение ресурса в <iframe> на других доменах.



      Информационные коды

      Данная группа отвечает за передачу данных. Коды этого типа свидетельствуют о том, что запрос принят сервером и обрабатывается.

      100 — Continue — Временный код ответа, означающий начало принятия запроса к его последующей обработке. 

      101 — Switching Protocols — Сообщает о переключении сервера на протокол, которые был указан в заголовке Upgrade запроса клиента.

      102 — Processing — Информация о том, что запрос принят сервером и находится в обработке, но этот процесс еще не завершен.

      103 — Early Hints — Используется для предварительной загрузки данных пока сервер формирует полный ответ. 




      Успешная обработка запроса

      Коды группы сообщают, что запрос не только принят сервером, но и успешно обработан.

      200 — OK — Один из самых популярных ответов. Он свидетельствует о том, что обмен данными между клиентом и сервером прошли успешно. Именно код ответа 200 ждут от ресурса, чтобы проверить, что все работает как надо: сайт загружен, файл открывается и т.д.

      201 — Created — Информирует об успешном создании нового ресурса в результате выполнения запроса. Например, была создана новая страница. Если сервер по каким-то причинам не смог обработать запрос и ресурс не был создан, то код ответа будет 202.

      202 — Accepted — Сообщает, что сервер принял запрос, но не завершил его обработку.

      203 — Non-Authoritative Information — Отвечает об успешной обработке запроса с оговоркой на то, что передаваемая информация была предоставлена не из исходного сервера, а другого источника (например, резервной копии) и может быть неактуальной. 

      204 — No Content — Сообщает об успешном принятии и обработке запроса, а также о том, что у сервера нет содержимого для отправки пользователю.

      205 — Reset Content — Сервер передает пользователю ответ в виде требований к сбросу введенных данных. Например, о необходимости очистить форму с заполненными до этого данными.

      206 — Partial Content — Свидетельствует о частичном выполнении GET-запроса сервером, возвращая только запрошенную пользователем часть контента. Этот код встречается при использовании кэширования. 




      Коды редиректов

      Данная группа кодов состояния сообщает о перенаправлении пользователя с его согласием или без него. 

      300 — Multiple Choices — Ответ срабатывает при условии, что по указанному запросу существует несколько вариантов URL. При таком варианте пользователь или User-agent должен выбрать альтернативный адрес.

      301 — Moved Permanently — Свидетельствует о перемещении ранее проиндексированного URL на новый адрес. Это команда роботу индексировать новую страницу вместо старой.

      301 редирект также используемся вебмастерами для перенаправления сайта с http://www.mixtelecom.ru на http://mixtelecom.ru. Применяется при переходе на защищенный протокол с HHTP на HTTPS. Используется для защиты доступа к внутренним файлам, например, /index.php переправляется на главный адрес сайта. Некоторые хостинги и CMS автоматически включают данные редиректы при выборе соответствующих опций при настройке сайта.

      302 — Found, 302 Moved Temporarily — Сообщает, что ранее проиндексированный URL был временно перемещен по другому адресу. При этом страница остается в индексе, а в ответе указывается новый адрес запрашиваемого URL.

      303 — See Other — Указывает пользователю, что запрошенная страница находится по другому адресу с запросом GET. 

      304 — Not Modified — Показывает, что запрашиваемая страница или объект не были изменены с момента последнего обновления кэша данного документа.

      305 — Use Proxy — Сообщает пользователю, что запрашиваемый ресурс доступен только через прокси. Данные по прокси указаны в ответе сервера.

      307 — Temporary Redirect — Код схож с 302, сообщая о временном перемещении ресурса на другой адрес. Разница заключается в способе обращения к ресурсу, который должен быть получен тем же методом, что и предыдущий запрос.




      Ошибки клиента

      Коды состояний данной группы сообщают об ошибках клиента, при которых сервер не может вызвать запрашиваемый результат.

      400 — Bad Request — Ошибка свидетельствует от том, что сервер не понял запрос пользователя из-за синтаксической ошибки.

      401 — Unauthorized — Сообщает о необходимости быть авторизованным для получения запрашиваемого доступа. Возникает при неправильном вводе данных пользователем при авторизации. 

      403 — Forbidden — Запрет доступа к запрашиваемой странице. Доступ может быть ограничен настройками индексации или запрещен для определенных IP.

      404 — Пожалуй, самая распространенная ошибка. Сообщает о том, что запрашиваемая страница не найдена. Самая частая причина — ошибка в написании адреса.

      Когда что-то пошло не так и пользователь не попал по запрашиваемому адресу куда хотел, позаботьтесь, чтобы на сайте была соответствующая страница для ошибки 404. На ней должна быть ссылка на главную страницу или меню ресурса, находиться поиск по сайту или контакты для связи. Если запрашиваемый URL был изменен, то настройте 301-редирект со старого адрес страницы на обновленный.

      405 — Method Not Allowed — Сообщает, что в запросе используется метод, который не поддерживается сервером.

      406 — Not Acceptable — Указывает, что запрашиваемый пользователем контент не может быть распознан. Причины могут быть в кодировке, методе сжатия или формате объекта. 

      407 — Proxy Authentication Required — Сообщает, что доступ может быть предоставлен только при авторизации через прокси-сервер. 

      408 — Request Timeout — Сервер прервал соединение с пользователем из-за слишком долгого ожидания. Данный ответ не возвращается если пользователь принудительно отменил запрос или соединение прервалось по иным причинам.

      409 — Conflict — Посылаемый пользователем запрос вызывает конфликт с сервером или другим обращением. 

      410 — Gone — Ответ сервера при запросе к странице или объекту, который был удален и более недоступен.

      411 — Length Required — Отказ сервера на обработку запроса если в нем не указан Content-Length заголовка.

      413 — Request Entity Too Large — Сервер не может обработать обращение из-за слишком большого размера запроса.

      414 — Request-URL Too Long — Сервер не может обработать обращение если в запросе указан слишком длинный URL.

      415 — Unsupported Media Type — Формат запроса пользователя не может быть обработан. Такое встречается при загрузке данных неподходящего формата. 

      416 — Requested Range Not Satisfiable — Отказ сервера на выполнение запроса из-за некорректного значения поля Range. 

      417 — Expectation Failed — Отказ сервера на выполнение запроса из-за некорректного значения поля Expect. 

      422— Unprocessable Entity — Сервер принял и распознал запрос, но не может его выполнить из-за наличия логической ошибки.

      423 — Locked — Запрашиваемая пользователем страница заблокирована. Как правило, это делается для защиты содержимого данной страницы или объекта.

      424 — Failed Dependency — Выполнение текущего запроса зависит от исхода других связанных с ней операций. Если условия не будут соблюдены, то соединение будет разорвано. 

      426 — Upgrade Required — Ошибка указывает на необходимость обновить протокол. Встречается, когда сервер запрашивает https-соединение, которое не может быть предоставлено клиентом.

      429 — Too Many Requests — Возникает при превышении лимита отправляемых пользователем запросов за короткий промежуток времени. Часто используется настройками безопасности.




      Ошибки сервера

      В эту группу входят коды ошибок со стороны сервера, когда по тем или иным причинам он не способен обработать запрос или выполнить требуемую операцию. 

      500 — Internal Server Error — Код оповещает о возникшей внутренней ошибке сервера или его аварийном отказе. 

      501 — Not Implemented — Сервер столкнулся с запросом, который не смог распознать. Либо запрос не поддерживается и не может быть обработан. 

      502 — Bad Gateway — Сообщает о неправильном получении ответа вышестоящего сервера. Частая причина — несогласованные протоколов между шлюзом и сервером (ошибки DNS, прокси, хостинга).

      Если ваш сайт выдает ошибку 502, то вероятнее всего вносились правки или совершались обновления системы. Просмотрите логи для выявления причины. Если на сайте не было никаких работ и апдейтов, то проверьте ресурсы памяти, процессора, php-лимиты сервера. Возможно их недостаточно для корректной обработки запросов. Причинами также могут быть подключенные CDN или anti-DDoS сервисы. Обратитесь в техподдержку.

      503 — Service Unavailable — Указывает на временную недоступность сервера. Причиной может быть его перезагрузка, техническое обслуживание, обращение слишком большого количества пользователей при наличии подобных ограничений. Как правило, сообщение об ошибке содержит параметр Retry-After, информирующий о времени восстановления штатной работы ресурса.

      504 — Gateway Time-out — Истек срок ожидания ответа от вышестоящего сервера. Возможные причины: недостаток ресурсов, неполадки с сетевым соединением, ошибки HTTP протокола, настроен слишком короткий срок ожидания.

      505 — HTTP Version Not Supported — Используемая в запросе версия протокола HTTP не поддерживается сервером. Встречается при использовании устаревшего формата HTTP-протокола.

      506 — Variant Also Negotiates — Сервер не может обработать запрос из-за его неправильной настройки. Сервер зацикливает ответ на себя, выдавая ошибку.

      507 — Insufficient Storage — Означает нехватку места на сервере для обработки запросов пользователя. Нужно освободить или увеличить память, либо обратиться в техническую поддержку.

      508 — Loop Detected — Ошибка возникает в связи с бесконечным перенаправлением. При обработке запроса возникает петля, что приводит к завершению операции.

      509 — Bandwidth Limit Exceeded — Превышен установленный лимит потребления трафика. Ошибка актуальная для интернет-каналов с ограничением по трафику.

      510 — Not Extended — Сервер не поддерживает и не может отработать запрашиваемое пользователем расширение. В теле ошибки может быть приведен список доступных расширений.

      511 — Network Authentication Required — Сообщает о необходимости авторизации для доступа к сети. Например, если пользователь не авторизовался при подключении к Wi-Fi.

      Благодаря приведенным выше кодам ответов намного легче понимать статус сервера при взаимодействии с ним. На практике большинство из них используются в виде указаний роботам по работе с сайтом и порядку его индексации. Сервисы мониторинга и технического анализа сайтов также ориентируются на коды ответов сервера для определения корректной работы ресурса. Вебмастеры могут опираться на статусы состояния в рамках настройки и поддержания работы сайтов. Системные администраторы могут понимать в чем причина неполадок и быстрее устранять возникшие неполадки. Если у вас возникли сложности, которые не получается решить самостоятельно, — воспользуйтесь услугой системного администрирования.