Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 947013 of HTTP

  • URL ревизии: Web/HTTP
  • Заголовок ревизии: HTTP
  • ID ревизии: 947013
  • Создано:
  • Автор: lerniri
  • Это текущая ревизия? Нет
  • Комментарий
Метки: 

Содержание ревизии

{{ HTTPSidebar }}

Протокол передачи гипер текста ( Hypertext Transfer Protocol - HTTP) это прикладной протокол для передачи данных. Он используется для общения между веб браузерами и веб серверами, хотя в принципе HTTP может использоваться и для других целей. Протокол следует классической клиент-серверной модели, когда клиент открывает соединение, инициирует запрос, а затем ждет ответа. HTTP не поддерживает статусы взаимодействия клиента и сервера ( stateless protocol )

Не смотря на то, что HTTP основан на TCP/IP , он так же может использовать любой транспорт

 

Документация

HTTP заголовки / HTTP headers 
Заголовки HTTP сообщения используются для точного описания загружаемого ресурса  или поведения сервера или клиента. Пользовательские заголовки можно добавить используя 'X-' префикс; другие перечислены в  IANA registry, содержание которого в свою очередь определено в RFC 4229. IANA так же поддерживает регистр предложенных новых HTTP заголовков .
HTTP куки / HTTP cookies
Как работают куки можно почитать в RFC 6265. В момент получения HTTP запроса , сервер может послать Set-Cookie заголовок в ответе. После этого, значение куки посылается с каждым запросом к этому серверу. Делается это в форме Cookie HTTP header. В дополнение, можно указать истечение срока куки, а так же ограничения для специфического домена или пути.
 Базовая аутентификация / Basic access authentication
В контексте HTTP транзакции, базовая аутентификация это метод, используемый HTTP юзер агентом (User Agent) для предоставления имени и пароля пользователя при инициации запроса.
HTTP pipelining FAQ
HTTP/1.1 Pipelining FAQ
Контроль доступа (совместное использование ресурсов между разными источниками)  / HTTP access control (CORS)
Кросс-сайт HTTP запросы это запросы к ресурсам, находящимся домене отличающимся от того, с которого производится запрос.  Напрмер, ресурс загружаемый с домена А (https://domaina.example) - HTML веб страница, запрашивает ресурс с домена Б (https://domainb.foo) - изображение, используя img тег (https://domainb.foo/image.jpg).  Это происходит сплошь и рядом в мире веба - страницы загружают различные ресурсы в кросс-сайт манере, включая стили (CSS) , изображения  и скрипты и другие ресурсы. 
Контроль предварительной загрузки DNS / Controlling DNS prefetching 
Firefox 3.5 выполняет предварительную загрузку DNS / DNS prefetching. При помощи данной функции Firefox заранее получает доменное имя ссылки, по которой следует пользователь, а также резолвит URL'ы для объектов ссылки на которые указаны в документе, включая изображения, CSS, JavaScript и так далее. Эта предварительная загрузка выполняется в фоновом режиме, так что вполне вероятно, что к моменту обращения к объектам в документе, DNS уже получен. Это уменьшает задержки, когда , например пользователь кликает на ссылку.
Коды ответа / HTTP response codes
Коды ответа  HTTP  указывают на результат выполнения определенного HTTP запроса. Ответы сгруппированы в пять категорий: информационные ответы, удачные ответы, перенаправления, ошибки клиента, и ошибки сервера.

View All...

 

Краткая история HTTP

С момента своего первого появления в качестве протокола с одним единственным методом (GET) , возвращаемого только HTML страницы, HTTP прошел через несколько ревизий. Первая версия, документированная как HTTP/0.9 in 1991 считается первоначальной.  Очень простой, у него был рудимент в виде поискового функционала через HTML {{ HTMLElement("isindex") }} элемент и расширение URL при помощи символа  '?'.

Затем в 1992 была опубликована версия, которая с минимальными изменениями стала  HTTP/1.0 (финализирована в RFC 1945 в Мае 1996). Одно важное улучшение по сравнению с предыдущей версией заключалось в возможности передавать файлы разных типов, а не только HTML : Изображения, видео, скрипты, CSS документы. Это было достигнуто использованием MIME типов  вместе с заголовком Content-Type.

В 1995, IETF  начала разработку новой версии HTTP, которая должна была стать HTTP/1.1. Она очень быстро стала широко использоваться, и была официально стандартизирована в 1997 в RFC 2068, с небольшими исправлениями в RFC 2616 2 года спустя.

HTTP/1.1 превнесла возможность повторно использовать установленное подключение для последовательных запросов, что значительно улучшило производительность протокола, уменьшив уровень задержек между запросами. Это особенно полезно в случаях сложных HTML документов, которым необходимо получить несколько последовательных файлов, таких как изображения или стили. Также в новой версии появился Host: заголовок, который позволяет одному серверу на один порт, получать запросы для нескольких веб сайтов; эта возможность проложила путь к размещению нескольких веб сайтов на одном сервере, что значительно уменьшило затраты на хостинг.

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

В настоящее время HTTP/1.1 пересматривается рабочей группой IETF HTTPbis Working Group.

HTTP сессия

Так как HTTP это клиент-серверный протокол , HTTP сессия состоит из трёх фаз:

  1. Клиент устанавливает TCP соеденения (или другое соединение, если не используется TCP транспорт).
  2. Клиент отправляет запрос и ждёт ответа. 
  3. Сервер обрабатывает запрос и посылает ответ, в котором содержится код статуса и соответствующие данные. 

Начиная с версии HTTP/1.1, после третьей фазы соединение не закрывается, так как клиенту позволяется инициировать другой запрос. То есть, вторая и третья фазы могут повторяться.

Установка соединения

Так как HTTP это клиент-серверный протокол, соединение всегда устанавливается клиентом. Открыть соединение в HTTP это значит установить соединение через соответствующий транспорт, обычно TCP.

В случае с TCP, в качестве порта HTTP сервера по умолчанию на компьютере используется порт 80, хотя другие также часто используются, например 8000 or 8080. URL загружаемой страницы содержит доменное имя и порт, который можно и не  указывать если он соответствует порту по умолчанию. 

Имеем в виду: Клиент-серверная модель не позволяет серверу посылать данные клиенту без явного запроса этих данных. Чтобы обойти эту проблему, веб разработчики используют различные техники: периодически пингуют сервер используя XMLHTTPRequest Javascript объект, HTML WebSockets API, или похожие протоколы.

Отправка запроса клиента

Когда соединение установлено user-agent может послать запрос. (user-agent это обычно веб браузер, но может им не быть) Клиентский запрос это текстовые директивы, разделенные между собой при помощи CRLF (переноса строки).  Сам запрос включает в себя три блока:

  1. Первые строки содержат метод запроса и его параметры: 
    • путь к документу - абсолютная URL без указания протокола и доменного имени
    • версию HTTP протокола 
  2. Каждая последующая строка представляет собой HTTP заголовок и передает серверу некоторую информацию о типах предпочитаемых данных (наприм. какой язык , какие MIME типы) или инструкции меняющие поведение сервера (наприм. не отправлять ответ, если он уже в кэше) . Эти HTTP заголовки формируют блок, который заканчивается пустой строкой.
  3. Последний блок является не обязательным и содержит дополнительные данные. По большей части используется методом POST.

Примеры запросов

  • Получаем главную страницу developer.mozilla.org,  https://developer.mozilla.org/, и говорим серверу, что user-agent предпочитает страницу на французском, если это возможно:
    GET / HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: fr 
    
    

    Обращаем внимание на пустую строку в конце, которая отделяет блок данных от блока заголовков. Так как в запросе отсутствует Content-Length: HTTP заголовок, блок с данными пуст и сервер может начать обработку запроса, как только получит пустую строку, означающую конец заголовков.

  • Отправляем результат сабмита формы:
    POST /contact_form.php HTTP/1.1
    Host: developer.mozilla.org
    Content-Length: 64
    Content-Type: application/x-www-form-urlencoded
    
    name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue
    

Структура ответа от сервера

После того как присоединенный агент отправил свой запрос, веб сервер обрабатывает его и отправляет ответ. По аналогии с клиентским запросом, ответ сервера это текстовые директивы разделенные между собой CRLF, сгруппированные в три разных блока:

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

Примеры ответов

  • Успешное получение веб страницы:
    HTTP/1.1 200 OK
    Date: Sat, 09 Oct 2010 14:28:02 GMT
    Server: Apache
    Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
    ETag: "51142bc1-7449-479b075b2891b"
    Accept-Ranges: bytes
    Content-Length: 29769
    Content-Type: text/html
    
    <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
    
    
  • Сообщение о том, что запрашиваемый ресурс был перемещен:
    HTTP/1.1 301 Moved Permanently
    Server: Apache/2.2.3 (Red Hat)
    Content-Type: text/html; charset=iso-8859-1
    Date: Sat, 09 Oct 2010 14:30:24 GMT
    Location: https://developer.mozilla.org/ (this is the new link to the resource; it is expected that the user-agent will fetch it)
    Keep-Alive: timeout=15, max=98
    Accept-Ranges: bytes
    Via: Moz-Cache-zlb05
    Connection: Keep-Alive
    X-Cache-Info: caching
    X-Cache-Info: caching
    Content-Length: 325 (the content contains a default page to display if the user-agent is not able to follow the link)
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>301 Moved Permanently</title>
    </head><body>
    <h1>Moved Permanently</h1>
    <p>The document has moved <a href="https://developer.mozilla.org/">here</a>.</p>
    <hr>
    <address>Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80</address>
    </body></html>
     
    
  • Сообщение о том, что запрашиваемый ресурс не существует:
    HTTP/1.1 404 Not Found
    Date: Sat, 09 Oct 2010 14:33:02 GMT
    Server: Apache
    Last-Modified: Tue, 01 May 2007 14:24:39 GMT
    ETag: "499fd34e-29ec-42f695ca96761;48fe7523cfcc1"
    Accept-Ranges: bytes
    Content-Length: 10732
    Content-Type: text/html
    
    <!DOCTYPE html... (contains a site-customized page helping the user to find the missing resource)
    
    

Постоянные соединения

Постоянные соединения появились в HTTP/1.1 версии. Они позволяют передавать несколько запросов по одному и тому же TCP соединению (или по любому другому транспорту, в случае если не используется TCP/IP). У этой функции есть несколько преимуществ:

  • Благодаря тому, что соединение может быть использовано повторно, запросы можно объединить в один ( HTTP pipelining ), что при отправке поможет уменьшенить задержки.
  • Уменьшение открытия и закрытия TCP соединений, сохраняет время CPU.
  • Перегруженность сети снижается за счет уменьшение общего количества TCP пакетов (меньше открывающих и закрывающих TCP пакетов).
  • У TCP стека появляется больше времени на диагностику перегруженности сети и соответствующие изменения окон отправки и получения данных. 
  • HTTP становится более адаптивным: цена проверки новой функции значительно уменьшается, так как получение ошибки от сервера не ведет к закрытию соединения. 

Методы HTTP запроса

Методы запроса обозначают действие, которое должно быть произведено на сервере. Стандарт HTTP/1.1 определяет семь методов, а также позволяет добавлять другие методы. За последние годы несколько методов было добавлено , например WebDAV. Группа IETF HTTPbis Working Group в настоящее время работает тем, чтобы перечислить все методы в IANA регистре. Если сервер получает метод, который он не знает, он должен вернуть  ответ 501 Not implemented ; Если он знает метод, но сконфигурирован не отвечать на него, то сервер должен вернуть 405 Method not allowed ответ. От сервера требуется поддержка двух методов: HEAD and GET; Все остальные не обязательны. 

Две характерные семантики определены в стандарте и являются важными для веб разработчиков: безопасность ( safety ) и идемпотентность ( idempotent ) методов. 

Безопасный метод

Безопасный метод это метод, который не оказывает влияние на сервер. Другими словами, это свойство метода означает, что он используется только лоя получения данных. Ниже перечислены безопасные HTTP методы, определеные в HTTP/1.1:

  • GET, используется для получения информации идентифицированной по URI, переданной в запросе. Эта информация может генерироваться на лету или GET может содержать условие - любое из следующих условий устанавливается в HTTP заголовках -  {{ httpheader("If-Modified-Since") }}, {{ httpheader("If-Unmodified-Since") }}, {{ httpheader("If-Match") }}, {{ httpheader("If-None-Match") }} или {{ httpheader("If-Range") }} . И в этом случае информация будет отправляться сервером исключительно при выполнении этих условий. 
  • HEAD, который идентичен GET , но не содержащий сообщения в теле запроса.
Имеем в виду:
  • Любой безопасный метод является идемпотентным.
  • Не оказывать влияния , для метода GET значит, что он не должен использоваться для вызова какого-либо действия на сервере, например для создания ордера на сайте интернет магазина. Если же влияние на сервер необходимо, то должен использоваться не идемпотентный метод, такой как POST.
  • Когда страница каким-либо скриптом на лету, механизм скрипта может генерировать страницу так , как будто бы она была запрошена в методе GET и затем разделять блок с данными. Это не вызывает проблем, пока метод GET, заимплементирован в скрипте как безопасный, но если же он оказывает влияние на сервер (например, вызывает создание ордера на сайте интернет магазина) метод HEAD также вызовет это действие. Веб разработчик должен убедиться, что оба метода GET and HEAD заимплементированны безопасно.

Идемпотентные методы

Идемпотентный метод это такой метод, который при отправке нескольких идентичных запросов оказывает такое же влияние на сервер, как и один запрос. 

  • HEAD и GET, как любые безопасные методы, также являются идемпотентными, так как не меняют сервер. 
  • PUT это способ загрузки нового ресурса на сервер. Если ресурс уже существует и отличается от загружаемого, то он будет перезаписан; если его не существует, то он будет создан. 
  • DELETE удаляет ресурс с сервера.

Другие методы

  • POST используется для вызова какого-либо действия на сервере. Он оказывает влияние и может использоваться для вызова процедуры создания ордера, для изменения в базе данных, для публикации сообщения на форуме и т.д.
  • OPTIONS это запрос на получение опций комуникации между клиентом и сервером. (через конечные прокси); Этот метод обычно посылается перед каждым пробным кросс-доменным запросом (preflighted cross-origin request), для того чтобы узнать безопано ли его делать.  
    Имеем в виду: Preflighted cross-origin requests / пробные кросс-доменные запросы не возможно сделать на серверах, которые не поддерживают метод OPTIONS.
  • TRACE это своего рода пинг между клиентом и сервером (через конечные прокси).

Многие другие методы, такие как PROPFIND или PATCH определены в других стандартах RFCs IETF, такие как WebDAV.

Метод CONNECT определен в RFC 2817.

Методы HTTP запросов в HTML формах

В HTML, разные методы HTTP запросов могут быть указаны в {{ htmlattrxref("method", "form") }} атрибуте элемента {{ HTMLElement("form") }}, а так же в {{ htmlattrxref("formmethod", "input") }} элемента  {{ HTMLElement("input") }} и элемента {{ HTMLElement("button") }}. Но не все HTTP методы могут использоваться в вышеуказаных атрибутах; только GET and POST методы доступны по HTML спецификации.

Имеем в виду: Выбор между методами GET и POST в HTML формах должен быть осознанным. Учитывая, что метод GET является безопасным методом, он должен быть использован только в тех случаях, когда влияние на сервер не требуется; например, форма не представляет собой пересылаемый ордер, так как ордер по сути это побочный эффект. Во всех случаях, когда подобные побочные эффекты необходимы, должен использоваться метод POST.

Коды HTTP ответа

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

  • Информационные (1xx) - предварительные ответы. В большинстве случаев ни конечный пользователь, ни веб разработчик или веб мастер не обращают на них внимание. Наиболее распространенный ответ 100 Continue , указывает на то, что клиент должен продолжить отправку своего запроса.
    Имеем в виду: Информационные ответы не определены в версии HTTP/1.0, и соотвественно не должны содержаться в ответе при использовании этой версии протокола.
  • Успешные (2xx) используются для безошибочно обработанных запросов. 200 OK ответ является одним из самых распространенных, но 206 Partial Content также можно часто увидеть при получении файлов или медиа данных таких как видео или аудио.
  • Перенаправление (3xx) указывают на то, что запрошенный клиентом ресурс изменил свое месторасположение, и сервер не может передать его напрямую. Большинство из этих ответов содержит информацию о местоположении, в котором можно найти запрашиваемый ресурс; агенты (user-agents) часто получают ресурс по новому адресу без взаимодействия с пользователем. Наиболее растространенными ответами данного типа являются 301 Moved Permanently, указывающий на то, что URI , переданный в запросе, больше не является валидным и переехал в другое место, 302 Found  говорит нам о том, что ресурс был временно перемещен в другое место. 
    Имеем в виду: Вебмастерам рекомендуется устанавливать  301 Moved Permanently перенаправления, в случае изменения URI страниц, например во время реорганизации сайта. Это позволяет пользователям, использующим старые ссылки, находить нужные ресурсы, а так же сообщает поисковым системам и другим сервисам новые адреса ресурсов, чтобы они могли переместить туда свои метаданные. Также важно добавлять соответствующие заголовки кэша в 301 Moved Permanently в ответ, для того, чтобы данная информация кэшировалась на стороне клиента. Это  помогает избежать ненужных запросов к оригинальной URI перед получением самого ресурса.
  • Клиентские ошибки (4xx) указывает на то, что запрос отправленный клиентом либо не правильный или неполный, либо у клиента не достаточно прав, чтобы его выполнить. Самый распространенный ответ в этой группе 404 Not Found , который возвращается в случае, когда запрошенный URI не существует, но пользователь может увидеть и другие ответы, например,  400 Bad Request возвращается в случаях не валидного HTTP запроса (так как это не должно происходить и может указывать на баг в клиенте (user agent) или, что менее вероятно, на сервере ) или 403 Forbidden, возвращается когда клиент запрашивает существующий ресурс, но который запрещен для передачи (например содержание директории).
  • Серверные ошибки (5xx) сообщают нам, что у сервера были проблемы с обработкой клиентского запроса. Двумя наиболее распространенными  ответами являются 500 Internal Server Error, универсальный код, означающий ошибку на сервере или 503 Service Unavailable указывает на то, что сервер не может запроцессить запрос в связи с временной проблемой, например в случае выключенного сервиса на время обслуживания или же не работающей базы данных.

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

Подробнее о перенаправлении

Начиная с Gecko 9.0 {{ geckoRelease("9.0") }}, перенаправления (такие как  301 и 307) , которые указывают javascript: URI более не выполняются. Вместо этого используется bad connection ответ. Это позволяет избежать кросс-доменных скриптовых атак. Подробнее см.  {{ bug(255119) }}.

HTTP headers

HTTP заголовки позволяют клиенту и серверу передавать дополнительную информацию в запросе и ответе. Заголовки запроса состоят из не чувствительных к регистру ключей, заканчивающихся двоеточием':', и следом их значением (без CRLF). Пробел перед значением ключа игнорируется.

Заголовки сгруппированы следующим образом: 

Общие заголовки
Эти заголовки применяются к запросам и ответам, но не связанны с данными пересылаемыми в теле запроса. Они применяются только к передаваемому сообщению. Их всего несколько и новые не добавляются без изменения версии HTTP протокола. Исчерпывающий список для версии HTTP/1.1 : {{ httpheader("Cache-Control") }}, {{ httpheader("Connection") }}, {{ httpheader("Date") }}, {{ httpheader("Pragma") }}, {{ httpheader("Trailer") }}, {{ httpheader("Transfer-Encoding") }}, {{ httpheader("Upgrade") }}, {{ httpheader("Via") }} and {{ httpheader("Warning") }}.
Заголовки запроса
Эти заголовки содержат более точную информацию о запрашиваемом ресурсе или о самом клиенте. Среди них мы можем найти заголовки относящиеся к кэшу ( cache-related headers ), условия для метода GET, например {{ httpheader("If-Modified-Since") }}, пользовательская информация, такая как {{ httpheader("Accept-Language") }} или {{ httpheader("Accept-Charset") }} или информация касаемая клиентского приложения: {{ httpheader("User-Agent") }}. Новые заголовки нельзя официально добавить, без изменения версии HTTP протокола. Однако, обычным делом является добавление нового заголовка, в случае если сервер и клиент договорились о его значении. В таком случае клиент не должен подразумевать, что новые заголовки будут адекватно обрабатываться сервером; неизвестные заголовки обрабатываются как заголовки объекта entity headers.
Заголовки ответа
Эти заголовки дают информацию о возвращаемом ресурсе - его реальное расположение  ({{ httpheader("Location") }}) или о самом сервере, например его имя и версия ({{ httpheader("Server") }}). Новые заголовки не могут быть добавлены без изменения версии HTTP протокола. Однако, обычным делом является добавление новых заголовков, в случае если сервер и клиент договорились об из значении. Правда в таком случае клиент не должен подразумевать, что новые заголовки будут адекватно обрабатываться сервером; неизвестные заголовки обрабатываются как заголовки объекта entity headers.
Заголовки объекта
Эти заголовки предоставляют информацию о теле объекта - длина ({{ httpheader("Content-Length") }}), хэш ({{ httpheader("Content-MD5") }}), или его MIME-тип ({{ httpheader("Content-Type") }}). Новые объектные заголовки можно добавлять без изменения версии HTTP протокола.

Заголовки могут быть также сгруппированы исходя из того как они обрабатываются средставми кэширования:

End-to-end заголовки
Эти заголовки должны быть переданы конечному получателю сообщения:  серверу в запросе или клиенту в ответе. Такой вид заголовка не должен измениться при передаче , а также должен быть сохранен в кэше.
Hop-by-hop заголовки
Такие заголовки имеют смысл только для единого соединения и не должны передаваться или кэшироваться. Примеры подобных заголовков : {{ httpheader("Connection") }}, {{ httpheader("Keep-Alive") }}, {{ httpheader("Proxy-Authenticate") }}, {{ httpheader("Proxy-Authorization") }}, {{ httpheader("TE") }}, {{ httpheader("Trailers") }}, {{ httpheader("Transfer-Encoding") }} и {{ httpheader("Upgrade") }}. Учтите, что только заголовки типа hop-by-hop могут быть установлены хэдером  {{ httpheader("Connection") }}.

Чтобы узнать больше о значении каждого хэдера, обратитесь к статье полный список HTTP заголовков (comprehensive list of HTTP headers).

Полезные заголовки запроса

Среди большого количества HTTP заголовков запроса, некоторые являются наиболее полезными. Если вы строите свой собственный запрос средствами XMLHTTPRequest или пишете расширение и посылаете пользовательские HTTP запросы через XPCOM, тогда вам необходимо обеспечить наличие заголовков, которые часто устанавливаются браузерами в соответствии с пользовательскими настройками. 

Контроль языка запрашиваемого ресурса
Многие клиенты (user-agents), такие как Firefox, позволяет пользователям устанавливать настройки языка запрашиваемых ресурсов. Браузер устанавливает эту настройку в  заголовке {{ httpheader("Accept-Language") }} . Хорошей практикой для веб разработчиков при построении HTTP запросов, является использование этого хэдера.
Использование условного GET
Кэширование это очень важный инструмент ускорения отображения веб страниц. Даже когда части страницы обновляются с использованием XMLHTTPRequest: хорошей идеей будет использовать хэдер {{ httpheader("If-Modified-Since") }} (и аналогичные ему) для того, чтобы получать новый контент только в случае его изменения. Такой подход уменьшает нагрузку на сеть. 

Полезные заголовки ответа

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

Запрет фрейминга ( Restricting framing )

Опасность применения атак с использованием кросс-доменного скриптинга (XSS) отбивают охоту использовать внешний контент внутри {{ HTMLElement("frame") }} или {{ HTMLElement("iframe") }}. Для минимизации риска в современных браузерах предусмотрен хэдер X-Frame-Options. Его установка в DENY, запрещает браузеру отображать ресурс внутри фрейма (frame). Использование этого заголовка с критическими ресурсами (содержащими важную информацию) уменьшит риск вызванный XSS атаками. Важно отметить, что этот заголовок не является единственным способом обезопаситься от XSS атак; существуют и другие техники, такие как Content Security Policies.

Сжатие

Минимизация количества передаваемых данных ускоряет отображение веб страницы. Хотя многие техники, такие как использование CSS Sprites, должны быть применены на самом сайте, сжатие данных устанавливается на уровне сервера. Если сжатие включено, ресурсы запрашиваемые клиентом с установленным хэдером {{ httpheader("Accept-Encoding") }} сжимаются используя соответствующий метод и отправляются с хэдером {{ httpheader("Content-Encoding") }}. В серверах Apache 2 эти установки делаются в mod_deflate модуле.

Имеем в виду:  Не все форматы данных эффективно сжимаются. Уже сжатые медиа данные, такие как JPEG изображения или большинство аудио и видео форматов, не уменьшаются при очередной компрессии. По факту они часто становятся даже больше из-за перегрузки методов сжатия. Очень важно не пытаться сжать данные виды ресурсов еще больше;  механизмы компрессии и декомпрессии ресурсоемкие, а преимуществ в размере вы не получите. 

Контроль кэша 

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

  • Каждый статический ресурс предоставляет {{ httpheader("Expires") }} хэдер в ответе и он установлен на далёкую будущую дату. Таким образом ресурс остается в кэше до тех пор, пока клиент не почистит его по своим причинам (например, при достижении предела размеров кэша).
    Имеем в виду: При использовании Apache, настройки кэширования и устанавливаются в файле   .htaccess при помощи инструкции ExpiresDefault: ExpiresDefault "access plus 1 month".
  • Любой динамический ресурс предоставляет хэдер {{ httpheader("Cache-control") }}. Теоритически любой HTTP запрос сделанный через безопасные методы (GET или HEAD) или даже через  идемпотентные (DELETE, PUT) может быть кэширован; но на практике нужно анализировать возможный негативный побочный эффект, к которому может привести кэширование. 

Установка правильных MIME типов

MIME это способ сказать клиенту о типе передаваемого документа: расширение файла не имеет смысла в вебе. Поэтому настройка сервера для передачи правильных MIME типов с каждым документом очень важна: клиенты (user-agents) часто используют MIME-типы для определения действия, которое нужно совершить с полученным ресурсом.

Имеем в виду:
  • На Apache сервере, заматчить расширения на соответствующие MIME типы можно в файле .htaccess используя инструкцию AddType, пример AddType image/jpeg jpg.
  • В случае пересылки ресурса не известного типа, многие серверы по умолчанию используют MIME тип application/octet-stream ; В целях безопасности, многие браузеры, такие как Firefox, не позволяют настроить пользовательское действие для подобных ресурсов и вынуждают пользователя сохранять их на диске для использования. Некоторые весьма распространенные случаи не корректной конфигурации серверов происходят с файлами следующих типов: 
    • Rar-закодированные файлы.  В идеале было бы здорово иметь возможность установить реальный тип закодированных файлов; это часто не возможно ( так как сервер может и не знать типа файлов и они могут содержать несколько ресурсов разных типов) В таком случае настройте сервер так, чтобы он отправлял MIME тип application/x-rar-compressed или некоторые пользователи не смогут определить нужное дейстие для этих файлов.

    • Аудио и видео файлы. Только ресурсы с правильным MIME Типом будут распознаны и проиграны, используя элементы {{ HTMLElement("video") }} или {{ HTMLElement("audio") }} . Убедитесь, что вы используете  правильные MIME типы для аудио и видео ресурсов.

    • Проприетарные типы файлов. Обращайте особое внимание на передачу файлов с проприетарными типами. Не забывайте добавить x-префикс к их типу; иначе особая обработка будет не возможна.  Это особенно касается ресурсов, использующих Keyhole Markup Language, который должен передаваться как тип application/vnd.google-earth.kml+xml для оптимального использования. 

Сообщество

  • Mozilla форумы... {{ DiscussionList("dev-web-development", "mozilla.dev.web.development") }}

Инструменты

Смотреть все...

См. также

{{ languages( { "ja": "ja/HTTP"} ) }}

Источник ревизии

<p>{{ HTTPSidebar }}</p>

<p>Протокол передачи гипер текста (&nbsp;<dfn>Hypertext Transfer Protocol -&nbsp;HTTP)</dfn>&nbsp;это прикладной протокол для передачи данных. Он используется для общения между веб браузерами и веб серверами, хотя в принципе HTTP может использоваться и для других целей. Протокол следует классической клиент-серверной модели, когда клиент открывает соединение, инициирует запрос, а затем ждет ответа. HTTP не поддерживает статусы взаимодействия клиента и сервера (&nbsp;<a href="https://en.wikipedia.org/wiki/Stateless_protocol" title="https://en.wikipedia.org/wiki/Stateless_protocol">stateless protocol</a>&nbsp;)</p>

<p>Не смотря на то, что HTTP основан на TCP/IP , он так же может использовать любой <a href="https://en.wikipedia.org/wiki/Transport_Layer">транспорт</a>.&nbsp;</p>

<p>&nbsp;</p>

<div class="topicpage-table"><!-- div class="section" -->
<h2 class="Documentation" id="Documentation" name="Documentation">Документация</h2>

<dl>
 <dt><a href="/en-US/docs/HTTP/Headers" title="/en-US/docs/HTTP/Headers">HTTP заголовки&nbsp;</a>/ HTTP&nbsp;headers&nbsp;</dt>
 <dd>Заголовки HTTP сообщения используются для точного описания загружаемого ресурса&nbsp;&nbsp;или поведения сервера или клиента. Пользовательские заголовки можно добавить используя&nbsp;'X-' префикс; другие перечислены в &nbsp;<a class="external" href="https://www.iana.org/assignments/message-headers/perm-headers.html" title="https://www.iana.org/assignments/message-headers/perm-headers.html">IANA registry</a>, содержание которого в свою очередь определено в&nbsp;<a class="external" href="https://tools.ietf.org/html/rfc4229" title="https://tools.ietf.org/html/rfc4229">RFC 4229</a>. IANA так же поддерживает&nbsp;<a class="external" href="https://www.iana.org/assignments/message-headers/prov-headers.html" title="https://www.iana.org/assignments/message-headers/prov-headers.html">регистр предложенных новых HTTP заголовков&nbsp;</a>.</dd>
 <dt><a href="/en/Web_Development/HTTP_cookies" title="HTTP cookies">HTTP куки&nbsp;</a>/ HTTP cookies</dt>
 <dd>Как работают куки можно почитать в <a class="external" href="https://tools.ietf.org/html/rfc6265">RFC 6265</a>. В момент получения HTTP запроса , сервер может послать Set-Cookie заголовок в ответе. После этого, значение куки посылается с каждым запросом к этому серверу. Делается это в форме Cookie HTTP header. В дополнение, можно указать истечение срока куки, а так же ограничения для специфического домена или пути.</dd>
 <dt>&nbsp;<a href="/en-US/docs/HTTP/Basic_access_authentication">Базовая аутентификация</a>&nbsp;/ Basic access authentication</dt>
 <dd>В контексте HTTP транзакции, <strong>базовая аутентификация&nbsp;</strong>это метод, используемый&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/API/window.navigator.userAgent" title="HTTP user agent">HTTP юзер&nbsp;агентом&nbsp;(User Agent)</a><a href="en-US/docs/Web/API/window.navigator.userAgent">&nbsp;</a>для предоставления имени и пароля пользователя при инициации запроса.</dd>
 <dt><a href="/en/HTTP_Pipelining_FAQ" title="https://developer.mozilla.org/en/HTTP_Pipelining_FAQ">HTTP pipelining FAQ</a></dt>
 <dd>HTTP/1.1 Pipelining FAQ</dd>
 <dt><a href="/en-US/docs/HTTP/Access_control_CORS">Контроль доступа (совместное использование ресурсов между разными источниками) &nbsp;/&nbsp;HTTP access control (CORS)</a></dt>
 <dd><strong>Кросс-сайт HTTP запросы</strong>&nbsp;это запросы к ресурсам, находящимся домене отличающимся от того, с которого производится запрос. &nbsp;Напрмер, ресурс загружаемый с домена А (<code><span class="nowiki">https://domaina.example</span></code>) - HTML веб страница, запрашивает ресурс&nbsp;с домена Б (<span class="nowiki">https://domainb.foo</span>) -&nbsp;изображение, используя <code>img</code> тег (<code><span class="nowiki">https://domainb.foo/image.jpg</span></code>). &nbsp;Это происходит сплошь и рядом в мире веба&nbsp;- страницы загружают различные ресурсы в кросс-сайт манере, включая стили (CSS) , изображения &nbsp;и скрипты и другие ресурсы.&nbsp;</dd>
 <dt><a href="https://developer.mozilla.org/En/Controlling_DNS_prefetching">Контроль&nbsp;предварительной&nbsp;загрузки DNS&nbsp;/</a>&nbsp;<a href="/En/Controlling_DNS_prefetching" title="En/Controlling DNS prefetching">Controlling DNS&nbsp;prefetching</a>&nbsp;</dt>
 <dd>Firefox 3.5 выполняет <strong>предварительную загрузку DNS /</strong>&nbsp;<strong>DNS&nbsp;prefetching</strong>. При помощи данной функции Firefox заранее получает доменное имя&nbsp;ссылки, по которой следует пользователь, а также резолвит URL'ы для объектов ссылки на которые указаны в документе, включая изображения, CSS, JavaScript и так далее. Эта предварительная загрузка выполняется в фоновом режиме, так что вполне вероятно, что к моменту обращения к объектам в документе, DNS уже получен. Это уменьшает задержки, когда , например пользователь кликает на ссылку.</dd>
 <dt><a href="/en-US/docs/HTTP/HTTP_response_codes">Коды ответа&nbsp;/&nbsp;HTTP response codes</a></dt>
 <dd>Коды ответа &nbsp;HTTP&nbsp;&nbsp;указывают на результат выполнения определенного&nbsp;<a href="https://developer.mozilla.org/en/HTTP" title="en/HTTP">HTTP</a> запроса. Ответы сгруппированы в пять категорий: информационные ответы, удачные ответы, перенаправления, ошибки клиента, и ошибки сервера.</dd>
</dl>

<p><span class="alllinks"><a href="/en-US/docs/tag/HTTP" title="tag/HTTP">View All...</a></span></p>
<!--/div-->

<p>&nbsp;</p>
</div>

<h2 id="Краткая_история_HTTP">Краткая история HTTP</h2>

<p>С момента своего первого появления&nbsp;в качестве протокола с одним единственным методом (GET) , возвращаемого только&nbsp;HTML страницы, HTTP прошел через несколько ревизий. Первая версия, документированная как&nbsp;HTTP/0.9 in 1991 считается первоначальной.&nbsp;&nbsp;Очень простой, у него был рудимент в виде поискового функционала через&nbsp;HTML&nbsp;{{ HTMLElement("isindex") }} элемент и расширение&nbsp;URL при помощи символа&nbsp;&nbsp;'<span style="font-family:courier new">?</span>'.</p>

<p>Затем в 1992 была опубликована версия, которая с минимальными изменениями стала&nbsp;&nbsp;HTTP/1.0 (финализирована&nbsp;в <a class="external" href="https://tools.ietf.org/html/rfc1945" title="https://tools.ietf.org/html/rfc1945">RFC 1945</a> в Мае 1996). Одно важное улучшение по сравнению с предыдущей версией заключалось в возможности передавать файлы разных типов, а не только HTML : Изображения, видео, скрипты, CSS документы. Это было достигнуто использованием&nbsp;<a class="external" href="https://en.wikipedia.org/wiki/Mime_types" title="https://en.wikipedia.org/wiki/Mime_types">MIME типов&nbsp;</a>&nbsp;вместе с заголовком&nbsp;<code>Content-Type</code>.</p>

<p>В 1995, <a class="external" href="https://www.ietf.org/" title="https://www.ietf.org/">IETF</a>&nbsp; начала разработку новой версии HTTP, которая должна была стать HTTP/1.1. Она очень быстро стала широко использоваться, и была официально стандартизирована в 1997 в&nbsp;<a class="external" href="https://tools.ietf.org/html/rfc2068" title="https://tools.ietf.org/html/rfc2068">RFC 2068</a>, с небольшими исправлениями в&nbsp;<a class="external" href="https://tools.ietf.org/html/rfc2616" title="https://tools.ietf.org/html/rfc2616">RFC 2616</a> 2 года спустя.</p>

<p>HTTP/1.1 превнесла возможность повторно использовать установленное подключение для последовательных запросов, что значительно улучшило производительность протокола, уменьшив уровень задержек между запросами. Это особенно полезно в случаях сложных&nbsp;HTML документов, которым необходимо получить несколько последовательных файлов, таких как изображения или стили. Также в новой версии появился&nbsp;<code>Host:</code> заголовок, который позволяет одному серверу на один порт, получать запросы для нескольких веб сайтов; эта возможность проложила путь к размещению нескольких веб сайтов на одном сервере, что значительно уменьшило затраты на хостинг.</p>

<p>С тех пор HTTP протокол развивался добавлением новых &nbsp;<a href="/en/HTTP/Headers" title="en/HTTP/Headers">заголовков</a>, определяющих новые поведения без необходимости фундаментального изменения протокола. Неизвестные заголовки просто игнорируются серверами и клиентами.&nbsp;</p>

<p>В настоящее время HTTP/1.1 пересматривается рабочей группой&nbsp;<a class="external" href="https://tools.ietf.org/wg/httpbis/" title="https://tools.ietf.org/wg/httpbis/">IETF&nbsp;HTTPbis&nbsp;Working Group</a>.</p>

<h2 id="HTTP_сессия">HTTP сессия</h2>

<p>Так как&nbsp;HTTP это клиент-серверный протокол , HTTP сессия состоит из трёх фаз:</p>

<ol>
 <li>Клиент устанавливает&nbsp;TCP соеденения (или другое соединение, если не используется&nbsp;TCP транспорт).</li>
 <li>Клиент отправляет запрос и ждёт ответа.&nbsp;</li>
 <li>Сервер обрабатывает запрос и посылает ответ, в котором содержится код статуса и соответствующие данные.&nbsp;</li>
</ol>

<p>Начиная с версии HTTP/1.1, после третьей фазы соединение не закрывается, так как клиенту позволяется инициировать другой запрос. То есть, вторая и третья фазы могут повторяться.</p>

<h3 id="Установка_соединения">Установка соединения</h3>

<p>Так как HTTP это клиент-серверный протокол, соединение всегда устанавливается клиентом. Открыть соединение в&nbsp;HTTP это значит установить соединение через соответствующий транспорт, обычно&nbsp;TCP.</p>

<p>В случае с TCP, в качестве порта HTTP сервера по умолчанию&nbsp;на компьютере используется порт 80, хотя другие также часто используются, например 8000 or 8080. URL загружаемой страницы содержит доменное имя и порт, который можно и не&nbsp;&nbsp;указывать если он соответствует порту по умолчанию.&nbsp;</p>

<div class="note"><strong>Имеем в виду:</strong>&nbsp;Клиент-серверная модель не позволяет серверу посылать данные клиенту без явного запроса этих данных. Чтобы обойти эту проблему, веб разработчики используют различные техники: периодически пингуют сервер используя&nbsp;<a href="/en/DOM/XMLHttpRequest" title="en/XMLHTTPRequest">XMLHTTPRequest</a> Javascript объект, HTML <a href="/en/WebSockets" title="en/WebSockets">WebSockets API</a>, или похожие протоколы.</div>

<h3 id="Отправка_запроса_клиента">Отправка запроса клиента</h3>

<p>Когда соединение установлено user-agent может послать запрос. (user-agent это обычно веб браузер, но может им не быть) Клиентский запрос это текстовые директивы, разделенные между собой при помощи&nbsp;CRLF (переноса строки).&nbsp;&nbsp;Сам запрос включает в себя три блока:</p>

<ol>
 <li>Первые строки&nbsp;содержат&nbsp;метод запроса и его параметры:&nbsp;
  <ul>
   <li>путь к документу - абсолютная&nbsp;URL без указания протокола и доменного имени</li>
   <li>версию HTTP протокола&nbsp;</li>
  </ul>
 </li>
 <li>Каждая последующая строка представляет собой&nbsp;HTTP&nbsp;заголовок и передает серверу некоторую информацию о типах предпочитаемых данных (наприм. какой язык , какие&nbsp;MIME типы) или инструкции меняющие&nbsp;поведение сервера (наприм. не отправлять ответ, если он уже в кэше) . Эти&nbsp;HTTP заголовки формируют блок, который заканчивается пустой строкой.</li>
 <li>Последний блок является не обязательным и содержит дополнительные данные. По большей части используется методом&nbsp;POST.</li>
</ol>

<h4 id="Примеры_запросов">Примеры запросов</h4>

<ul>
 <li>Получаем главную страницу developer.mozilla.org, &nbsp;<a class="linkification-ext external" href="/" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a>, и говорим серверу, что user-agent предпочитает страницу на французском, если это возможно:

  <pre>
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr 

</pre>

  <p>Обращаем внимание на пустую строку в конце, которая отделяет блок данных от блока заголовков. Так как в запросе отсутствует&nbsp;<code>Content-Length:</code> HTTP&nbsp;заголовок, блок с данными пуст и сервер может начать обработку запроса, как только получит пустую строку, означающую конец заголовков.</p>
 </li>
 <li>Отправляем результат сабмита формы:
  <pre>
POST /contact_form.php HTTP/1.1
Host: developer.mozilla.org
Content-Length: 64
Content-Type: application/x-www-form-urlencoded

name=Joe%20User&amp;request=Send%20me%20one%20of%20your%20catalogue
</pre>
 </li>
</ul>

<h3 id="Структура_ответа_от_сервера">Структура ответа от сервера</h3>

<p>После того как присоединенный агент отправил свой запрос, веб сервер обрабатывает его и отправляет ответ. По аналогии с клиентским запросом, ответ сервера это текстовые директивы разделенные между собой&nbsp;CRLF, сгруппированные в три разных блока:</p>

<ol>
 <li>Первая строка - строка статуса, состоит из подтверждения используемой&nbsp;HTTP версии и статуса запроса (и его значения в виде понятным человеку).</li>
 <li>Последующие строки представляют собой&nbsp;HTTP&nbsp;заголовки, дающие клиенту некоторую информацию о посылаемой дате (прим. тип, размер, алгоритм сжатия, подсказки по кэшированию).&nbsp;Так же как и в случае клиентского запроса, эти&nbsp;HTTP заголовки формируют блок, заканчивающийся пустой строкой.</li>
 <li>Последний блок содержит данные (если таковые имеются).</li>
</ol>

<h4 id="Примеры_ответов">Примеры ответов</h4>

<ul>
 <li>Успешное получение&nbsp;веб страницы:
  <pre>
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html

&lt;!DOCTYPE html... <em><strong>(here comes the 29769 bytes of the requested web page)</strong></em>

</pre>
 </li>
 <li>Сообщение о том, что запрашиваемый ресурс был перемещен:
  <pre>
HTTP/1.1 301 Moved Permanently
Server: Apache/2.2.3 (Red Hat)
Content-Type: text/html; charset=iso-8859-1
Date: Sat, 09 Oct 2010 14:30:24 GMT
Location: <a class="linkification-ext" href="../../../../" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a> <strong><em>(this is the</em><em> new link to the resource; it is expected that the user-agent will fetch it)</em></strong>
Keep-Alive: timeout=15, max=98
Accept-Ranges: bytes
Via: Moz-Cache-zlb05
Connection: Keep-Alive
X-Cache-Info: caching
X-Cache-Info: caching
Content-Length: 325 <em>(<strong>the content contains a default page to display if the user-agent is not able to follow the link)</strong></em>

&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;
&lt;html&gt;&lt;head&gt;
&lt;title&gt;301 Moved Permanently&lt;/title&gt;
&lt;/head&gt;&lt;body&gt;
&lt;h1&gt;Moved Permanently&lt;/h1&gt;
&lt;p&gt;The document has moved &lt;a href="<a class="linkification-ext" href="../../../../" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a>"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;address&gt;Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80&lt;/address&gt;
&lt;/body&gt;&lt;/html&gt;
 
</pre>
 </li>
 <li>Сообщение о том, что запрашиваемый ресурс не существует:
  <pre>
HTTP/1.1 404 Not Found
Date: Sat, 09 Oct 2010 14:33:02 GMT
Server: Apache
Last-Modified: Tue, 01 May 2007 14:24:39 GMT
ETag: "499fd34e-29ec-42f695ca96761;48fe7523cfcc1"
Accept-Ranges: bytes
Content-Length: 10732
Content-Type: text/html

&lt;!DOCTYPE html... <strong><em>(contains a site-customized page helping the user to find the missing resource)</em></strong>

</pre>
 </li>
</ul>

<h3 id="Постоянные_соединения">Постоянные соединения</h3>

<p>Постоянные соединения появились в HTTP/1.1 версии. Они позволяют передавать несколько запросов по одному и тому же&nbsp;TCP соединению&nbsp;(или по любому другому транспорту, в случае если&nbsp;не используется TCP/IP). У этой функции есть несколько преимуществ:</p>

<ul>
 <li>Благодаря тому, что соединение может быть использовано повторно, запросы можно объединить в один ( <a href="/en/HTTP_Pipelining_FAQ">HTTP&nbsp;pipelining</a>&nbsp;), что при отправке поможет&nbsp;уменьшенить&nbsp;задержки.</li>
 <li>Уменьшение открытия и закрытия TCP соединений, сохраняет время&nbsp;CPU.</li>
 <li>Перегруженность сети снижается за счет уменьшение общего количества&nbsp;TCP&nbsp;пакетов (меньше открывающих и закрывающих TCP&nbsp;пакетов).</li>
 <li>У TCP стека появляется больше времени на диагностику перегруженности сети и соответствующие&nbsp;изменения&nbsp;окон отправки и получения данных.&nbsp;</li>
 <li>HTTP&nbsp;становится более адаптивным: цена проверки новой функции значительно уменьшается, так как получение ошибки от сервера не ведет к закрытию соединения.&nbsp;</li>
</ul>

<h2 id="Методы_HTTP_запроса">Методы&nbsp;HTTP запроса</h2>

<p>Методы запроса обозначают действие, которое должно быть произведено на сервере. Стандарт HTTP/1.1 определяет&nbsp;семь методов, а также позволяет добавлять другие методы. За последние годы несколько методов было добавлено , например&nbsp;<a href="/en/WebDAV" title="en/WebDAV">WebDAV</a>. Группа&nbsp;<a class="external" href="https://tools.ietf.org/wg/httpbis/" rel="external nofollow" target="_blank" title="https://tools.ietf.org/wg/httpbis/">IETF&nbsp;HTTPbis&nbsp;Working Group</a>&nbsp;в настоящее время работает тем, чтобы перечислить все методы в&nbsp;IANA регистре. Если сервер получает метод, который он не знает, он должен вернуть&nbsp;&nbsp;ответ&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#501" rel="internal" title="en/HTTP/HTTP response codes#501">501 Not implemented</a></span>&nbsp;; Если он знает метод, но сконфигурирован не отвечать на него, то сервер должен вернуть&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#501" rel="internal" title="en/HTTP/HTTP response codes#501">405 Method not allowed</a></span> ответ. От сервера требуется поддержка двух методов: HEAD&nbsp;and GET; Все остальные не обязательны.&nbsp;</p>

<p>Две характерные семантики определены в стандарте и являются важными для веб разработчиков: безопасность (&nbsp;<em>safety</em>&nbsp;) и идемпотентность (&nbsp;<em>idempotent )&nbsp;</em>методов.&nbsp;</p>

<h3 id="Safe_methods">Безопасный метод</h3>

<p>Безопасный метод это метод, который не оказывает влияние на сервер. Другими словами, это свойство метода означает, что он используется только лоя <em>получения</em> данных. Ниже перечислены безопасные&nbsp;HTTP методы,&nbsp;определеные в HTTP/1.1:</p>

<ul>
 <li>GET, используется для получения информации идентифицированной по&nbsp;URI, переданной в запросе. Эта информация может генерироваться на лету или GET может содержать условие - любое из следующих условий устанавливается в HTTP&nbsp;заголовках -&nbsp;&nbsp;{{ httpheader("If-Modified-Since") }}, {{ httpheader("If-Unmodified-Since") }}, {{ httpheader("If-Match") }}, {{ httpheader("If-None-Match") }} или&nbsp;{{ httpheader("If-Range") }} . И в этом случае информация будет отправляться сервером исключительно при выполнении этих условий.&nbsp;</li>
 <li>HEAD, который идентичен GET , но не содержащий&nbsp;сообщения в теле запроса.</li>
</ul>

<div class="note"><strong>Имеем в виду: </strong>

<ul>
 <li>Любой безопасный метод является <em>идемпотентным</em>.</li>
 <li>Не оказывать влияния , для метода GET значит, что он <strong>не должен</strong> использоваться для вызова какого-либо действия на сервере, например для создания&nbsp;ордера на сайте интернет магазина. Если же влияние на сервер необходимо, то должен использоваться не <em>идемпотентный</em> метод, такой как&nbsp;POST.</li>
 <li>Когда страница каким-либо скриптом на лету, механизм скрипта может генерировать страницу так , как будто бы она была&nbsp;запрошена&nbsp;в методе&nbsp;GET и затем разделять блок с данными. Это не вызывает проблем, пока метод GET, заимплементирован в скрипте как безопасный, но если же он оказывает влияние на сервер&nbsp;(например, вызывает создание ордера на сайте интернет магазина)&nbsp;метод&nbsp;HEAD также вызовет это действие. Веб разработчик должен убедиться, что оба метода&nbsp;GET and HEAD заимплементированны безопасно.</li>
</ul>
</div>

<h3 id="Idempotent_methods">Идемпотентные методы</h3>

<p>Идемпотентный метод это такой метод, который при отправке нескольких идентичных запросов оказывает такое же влияние на сервер, как и один запрос.&nbsp;</p>

<ul>
 <li>HEAD и GET, как любые безопасные методы, также являются идемпотентными, так как не меняют сервер.&nbsp;</li>
 <li>PUT это способ загрузки нового ресурса на сервер. Если ресурс уже существует и отличается от загружаемого, то он будет перезаписан; если его не существует, то он будет создан.&nbsp;</li>
 <li>DELETE удаляет ресурс с сервера.</li>
</ul>

<h3 id="Other_methods">Другие методы</h3>

<ul>
 <li>POST используется для вызова какого-либо действия на сервере. Он оказывает влияние и может использоваться для вызова процедуры создания ордера, для изменения в базе данных, для публикации сообщения на форуме и т.д.</li>
 <li>OPTIONS это запрос на получение опций комуникации между клиентом и сервером. (через конечные прокси); Этот метод обычно посылается перед каждым <a href="/En/HTTP_access_control#Preflighted_requests">пробным кросс-доменным запросом (preflighted cross-origin request)</a>, для того чтобы узнать безопано ли его делать. &nbsp;
  <div class="note"><strong>Имеем в виду:</strong> <a href="/En/HTTP_access_control#Preflighted_requests" title="en/HTTP access control#Preflighted requests">Preflighted cross-origin requests</a>&nbsp;/ пробные кросс-доменные запросы не возможно сделать на серверах, которые не поддерживают метод&nbsp;OPTIONS.</div>
 </li>
 <li>TRACE это своего рода пинг между клиентом и сервером (через конечные прокси).</li>
</ul>

<p>Многие&nbsp;другие&nbsp;методы, такие&nbsp;как PROPFIND или&nbsp;PATCH определены в других стандартах&nbsp;RFCs IETF, такие как WebDAV.</p>

<p>Метод CONNECT определен в&nbsp;<a class="external" href="https://tools.ietf.org/html/rfc2817" title="https://tools.ietf.org/html/rfc2817">RFC&nbsp;2817</a>.</p>

<h3 id="HTTP_Requests_Methods_in_HTML_Forms">Методы HTTP запросов в&nbsp;HTML&nbsp;формах</h3>

<p>В HTML, разные методы HTTP&nbsp;запросов могут быть указаны в {{ htmlattrxref("method", "form") }} атрибуте элемента&nbsp;{{ HTMLElement("form") }}, а так же в {{ htmlattrxref("formmethod", "input") }} элемента&nbsp;&nbsp;{{ HTMLElement("input") }} и элемента {{ HTMLElement("button") }}. Но не все HTTP методы могут использоваться в вышеуказаных атрибутах; только&nbsp;GET and POST методы доступны по HTML&nbsp;спецификации.</p>

<div class="note"><strong>Имеем в виду</strong>: Выбор между методами GET и POST в HTML формах должен быть осознанным. Учитывая, что метод&nbsp;GET является <a href="/en/HTTP#Safe_methods">безопасным методом</a>, он должен быть использован только в тех случаях, когда влияние на сервер не требуется; например, форма не представляет собой пересылаемый ордер, так как ордер по сути это побочный эффект. Во всех случаях, когда подобные побочные эффекты необходимы, должен использоваться метод&nbsp;POST.</div>

<h2 id="HTTP_response_codes">Коды HTTP ответа</h2>

<p>Когда сервер отвечает на клиентский запрос, он отправляет трехзначный номер (код), указывающий на результат выполнения запроса.&nbsp;Эти коды можно разделить на три группы:</p>

<ul>
 <li><strong><dfn>Информационные </dfn>(<code>1xx</code>) </strong>- предварительные ответы. В большинстве случаев ни конечный пользователь, ни веб разработчик или веб мастер не обращают на них внимание. Наиболее распространенный ответ&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#100" title="en/HTTP/HTTP response codes#100">100 Continue</a></span>&nbsp;, указывает на то, что клиент должен продолжить отправку своего запроса.

  <div class="note"><strong>Имеем в виду:</strong>&nbsp;Информационные ответы не определены в версии&nbsp;HTTP/1.0, и соотвественно не должны содержаться в ответе при использовании этой версии протокола.</div>
 </li>
 <li><strong>Успешные (<code>2xx</code>)</strong> используются для безошибочно обработанных запросов.&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#200" title="en/HTTP/HTTP response codes#200">200 OK</a></span>&nbsp;ответ является одним из самых распространенных, но&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#206" title="en/HTTP/HTTP response codes#206">206 Partial Content</a></span>&nbsp;также можно часто увидеть при получении файлов или медиа данных таких как видео или аудио.</li>
 <li><strong><dfn>Перенаправление </dfn>(<code>3xx</code>) </strong>указывают на то, что запрошенный клиентом ресурс изменил свое месторасположение, и сервер не может передать его напрямую. Большинство из этих ответов содержит&nbsp;информацию о местоположении, в котором можно найти запрашиваемый ресурс; агенты (user-agents) часто получают ресурс по новому адресу без взаимодействия с пользователем. Наиболее растространенными&nbsp;ответами&nbsp;данного типа являются <span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#301" title="en/HTTP/HTTP response codes#301">301 Moved Permanently</a></span>, указывающий на то, что URI , переданный в запросе,&nbsp;больше не является валидным и переехал в другое место,&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#302" title="en/HTTP/HTTP response codes#302">302 Found</a></span>&nbsp; говорит нам о том, что&nbsp;ресурс был <em>временно </em>перемещен в другое место.&nbsp;
  <div class="note"><strong>Имеем в виду:</strong>&nbsp;Вебмастерам рекомендуется устанавливать &nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#301" title="en/HTTP/HTTP response codes#301">301 Moved Permanently</a></span> перенаправления, в случае изменения URI страниц, например во время реорганизации сайта. Это позволяет пользователям, использующим старые ссылки, находить нужные ресурсы, а так же сообщает поисковым системам и другим сервисам новые адреса ресурсов, чтобы они могли переместить туда&nbsp;свои метаданные. Также важно добавлять соответствующие заголовки кэша в&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#301" title="en/HTTP/HTTP response codes#301">301 Moved Permanently</a></span> в ответ, для того, чтобы данная информация кэшировалась на стороне клиента. Это&nbsp;&nbsp;помогает избежать ненужных запросов к оригинальной&nbsp;URI перед получением самого ресурса.</div>
 </li>
 <li><strong><dfn>Клиентские&nbsp;ошибки&nbsp;</dfn>(<code>4xx</code>)</strong> указывает на то, что запрос отправленный клиентом либо не правильный или&nbsp;неполный, либо у клиента не достаточно прав, чтобы его выполнить. Самый распространенный ответ в этой группе&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#404" title="en/HTTP/HTTP response codes#404">404 Not Found</a></span>&nbsp;, который возвращается в случае, когда запрошенный URI не существует, но пользователь может увидеть и другие ответы, например, &nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#400" title="en/HTTP/HTTP response codes#400">400 Bad Request</a></span>&nbsp;возвращается в случаях не валидного&nbsp;HTTP запроса (так как это не должно происходить и может указывать на баг в клиенте (user agent) или, что менее вероятно, на сервере&nbsp;) или&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#403" title="en/HTTP/HTTP response codes#403">403 Forbidden</a></span>, возвращается когда клиент запрашивает существующий ресурс, но который запрещен для передачи (например содержание директории).</li>
 <li><strong><dfn>Серверные ошибки </dfn>(<code>5xx</code>)</strong>&nbsp;сообщают нам, что у сервера были проблемы с обработкой клиентского запроса. Двумя&nbsp;наиболее распространенными&nbsp;&nbsp;ответами являются&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#500" title="en/HTTP/HTTP response codes#500">500 Internal Server Error</a></span>, универсальный код, означающий ошибку на сервере или&nbsp;<span style="font-family:courier new"><a href="/en/HTTP/HTTP_response_codes#503" title="en/HTTP/HTTP response codes#503">503 Service Unavailable</a></span>&nbsp;указывает на то, что сервер не может запроцессить запрос в связи с временной проблемой, например в случае выключенного сервиса на время обслуживания или же не работающей базы данных.</li>
</ul>

<p>С остальными кодами веб девелопер не сталкивается , но люди разрабатывающие запросы с использованием функции&nbsp;&nbsp;<code><a href="/en/nsIXMLHttpRequest" title="en/XMLHttpRequest">XMLHTTPRequest</a></code>&nbsp;могут увидеть и&nbsp;<a href="/en/HTTP/HTTP_response_codes">менее привычные коды ответа</a>.</p>

<h3 id="More_on_redirection_responses">Подробнее о перенаправлении</h3>

<p>Начиная с Gecko 9.0 {{ geckoRelease("9.0") }}, перенаправления (такие как &nbsp;301 и 307) , которые указывают <code>javascript:</code> URI более не выполняются. Вместо этого используется&nbsp;bad connection ответ. Это позволяет избежать кросс-доменных скриптовых атак. Подробнее см.&nbsp;&nbsp;{{ bug(255119) }}.</p>

<h2 id="HTTP_headers">HTTP headers</h2>

<p>HTTP заголовки позволяют клиенту и серверу передавать дополнительную информацию в запросе и ответе. Заголовки запроса состоят из не чувствительных к регистру ключей, заканчивающихся двоеточием':', и следом их значением (без CRLF). Пробел перед значением ключа игнорируется.</p>

<p>Заголовки сгруппированы следующим образом:&nbsp;</p>

<dl>
 <dt>Общие заголовки</dt>
 <dd>Эти заголовки применяются к запросам и ответам, но не связанны с данными пересылаемыми в теле запроса. Они применяются только к передаваемому сообщению. Их всего несколько и новые не добавляются без изменения версии HTTP&nbsp;протокола. Исчерпывающий список для версии HTTP/1.1 :&nbsp;{{ httpheader("Cache-Control") }}, {{ httpheader("Connection") }}, {{ httpheader("Date") }}, {{ httpheader("Pragma") }}, {{ httpheader("Trailer") }}, {{ httpheader("Transfer-Encoding") }}, {{ httpheader("Upgrade") }}, {{ httpheader("Via") }} and {{ httpheader("Warning") }}.</dd>
 <dt>Заголовки запроса</dt>
 <dd>Эти заголовки содержат&nbsp;более точную информацию о запрашиваемом ресурсе или о самом клиенте. Среди них мы можем найти заголовки относящиеся к кэшу (&nbsp;<a href="/en/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">cache-related headers</a>&nbsp;), условия для метода&nbsp;GET, например {{ httpheader("If-Modified-Since") }}, пользовательская информация, такая как&nbsp;{{ httpheader("Accept-Language") }} или&nbsp;{{ httpheader("Accept-Charset") }} или&nbsp;информация касаемая клиентского приложения:&nbsp;{{ httpheader("User-Agent") }}. Новые заголовки нельзя официально добавить, без изменения версии&nbsp;HTTP протокола. Однако, обычным делом является добавление нового заголовка, в случае если сервер и клиент договорились о его значении. В таком случае клиент не должен подразумевать, что новые заголовки будут адекватно обрабатываться сервером; неизвестные заголовки обрабатываются как заголовки объекта&nbsp;<em>entity headers</em>.</dd>
 <dt>Заголовки ответа</dt>
 <dd>Эти заголовки дают информацию о возвращаемом ресурсе - его реальное расположение&nbsp;&nbsp;({{ httpheader("Location") }}) или о самом сервере, например его имя и версия ({{ httpheader("Server") }}). Новые заголовки не могут быть добавлены без изменения версии HTTP протокола. Однако, обычным делом является добавление новых заголовков, в случае если сервер и клиент договорились об из значении. Правда в&nbsp;таком случае клиент не должен подразумевать, что новые заголовки будут адекватно обрабатываться сервером; неизвестные заголовки обрабатываются как заголовки объекта&nbsp;<em>entity headers</em>.</dd>
 <dt>Заголовки объекта</dt>
 <dd>Эти заголовки предоставляют информацию о теле объекта - длина&nbsp;({{ httpheader("Content-Length") }}), хэш ({{ httpheader("Content-MD5") }}), или его&nbsp;MIME-тип ({{ httpheader("Content-Type") }}). Новые объектные заголовки можно добавлять без изменения версии HTTP протокола.</dd>
</dl>

<p>Заголовки могут быть также сгруппированы исходя из того как они обрабатываются средставми кэширования:</p>

<dl>
 <dt>End-to-end заголовки</dt>
 <dd>Эти заголовки должны быть переданы конечному получателю сообщения:&nbsp;&nbsp;серверу в запросе или клиенту в ответе. Такой вид заголовка не должен измениться при передаче , а также должен быть сохранен в кэше.</dd>
 <dt>Hop-by-hop заголовки</dt>
 <dd>Такие заголовки имеют смысл только для единого соединения&nbsp;и не должны передаваться или кэшироваться. Примеры подобных заголовков&nbsp;: {{ httpheader("Connection") }}, {{ httpheader("Keep-Alive") }}, {{ httpheader("Proxy-Authenticate") }}, {{ httpheader("Proxy-Authorization") }}, {{ httpheader("TE") }}, {{ httpheader("Trailers") }}, {{ httpheader("Transfer-Encoding") }} и {{ httpheader("Upgrade") }}. Учтите, что только&nbsp;заголовки типа hop-by-hop могут быть установлены хэдером&nbsp;&nbsp;{{ httpheader("Connection") }}.</dd>
</dl>

<p>Чтобы узнать больше о значении каждого хэдера, обратитесь к статье&nbsp;<a href="/en/HTTP/Headers">полный список HTTP заголовков (comprehensive list of HTTP&nbsp;headers)</a>.</p>

<h3 id="Useful_request_headers">Полезные заголовки запроса</h3>

<p>Среди большого количества <a href="/en/HTTP/Headers" title="en/HTTP/Headers">HTTP заголовков запроса</a>, некоторые являются наиболее полезными. Если вы строите свой собственный запрос средствами <code><a href="/en/DOM/XMLHttpRequest" title="en/XMLHTTPRequest">XMLHTTPRequest</a></code>&nbsp;или пишете расширение и посылаете&nbsp;<a href="/en/Setting_HTTP_request_headers" title="en/Setting HTTP request headers">пользовательские&nbsp;HTTP запросы через&nbsp;XPCOM</a>, тогда вам необходимо обеспечить наличие заголовков, которые часто устанавливаются браузерами в соответствии с пользовательскими настройками.&nbsp;</p>

<dl>
 <dt>Контроль языка запрашиваемого ресурса</dt>
 <dd>Многие клиенты (user-agents), такие как Firefox, позволяет пользователям устанавливать настройки языка запрашиваемых ресурсов. Браузер устанавливает эту настройку в &nbsp;заголовке&nbsp;{{ httpheader("Accept-Language") }} . Хорошей практикой для веб разработчиков при построении HTTP&nbsp;запросов, является использование&nbsp;этого хэдера.</dd>
 <dt>Использование условного GET</dt>
 <dd>Кэширование это очень важный инструмент ускорения отображения веб страниц. Даже когда части страницы обновляются с использованием&nbsp;<code><a href="/en/DOM/XMLHttpRequest" title="en/XMLHTTPRequest">XMLHTTPRequest</a></code>: хорошей идеей будет использовать хэдер {{ httpheader("If-Modified-Since") }} (и аналогичные ему) для того, чтобы получать новый контент только в случае его изменения. Такой подход уменьшает нагрузку на сеть.&nbsp;</dd>
</dl>

<h3 id="Useful_response_headers">Полезные заголовки ответа</h3>

<p>Конфигурация веб сервера является критической частью обеспечения хорошей производительности и оптимальной безопасности веб сайта. Среди <a href="/en/HTTP/Headers">многочисленных HTTP заголовков ответа сервера</a>, некоторые являются весьма важными и обязательно должны быть настроены на сервере.&nbsp;</p>

<h4 id="Restricting_framing">Запрет фрейминга ( Restricting framing )</h4>

<p>Опасность применения атак&nbsp;с использованием кросс-доменного скриптинга&nbsp;(XSS) отбивают охоту использовать внешний&nbsp;контент внутри {{ HTMLElement("frame") }} или&nbsp;{{ HTMLElement("iframe") }}. Для минимизации риска в современных браузерах предусмотрен хэдер&nbsp;<code><a href="/en/The_X-FRAME-OPTIONS_response_header" title="en/The X-FRAME-OPTIONS response header">X-Frame-Options</a>.</code>&nbsp;Его установка в&nbsp;<code>DENY</code>, запрещает браузеру отображать ресурс внутри фрейма (frame). Использование этого заголовка с критическими ресурсами (содержащими важную информацию) уменьшит риск вызванный&nbsp;XSS атаками. Важно отметить, что этот заголовок не является единственным способом обезопаситься от&nbsp;XSS атак; существуют и другие техники, такие как <a href="/en/Security/CSP/Introducing_Content_Security_Policy" title="en/Security/CSP/Introducing Content Security Policy">Content Security Policies</a>.</p>

<h4 id="Compression">Сжатие</h4>

<p>Минимизация количества передаваемых данных ускоряет отображение веб страницы. Хотя многие техники, такие как использование&nbsp;<a href="/en/CSS/CSS_Sprites" title="en/CSS/CSS Sprites">CSS Sprites</a>, должны быть применены на самом сайте, сжатие данных устанавливается на уровне сервера. Если сжатие включено, ресурсы запрашиваемые клиентом с установленным хэдером {{ httpheader("Accept-Encoding") }} сжимаются используя соответствующий метод и отправляются с хэдером&nbsp;{{ httpheader("Content-Encoding") }}. В серверах&nbsp;Apache 2 эти установки делаются в <a class="external" href="https://httpd.apache.org/docs/2.0/mod/mod_deflate.html" title="https://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate модуле</a>.</p>

<div class="note"><strong>Имеем в виду:</strong>&nbsp; Не все форматы данных эффективно сжимаются. Уже сжатые медиа данные, такие как JPEG изображения или большинство&nbsp;аудио и видео форматов, не уменьшаются при очередной компрессии. По факту они часто становятся даже больше из-за перегрузки методов сжатия. Очень важно не пытаться сжать данные виды ресурсов еще больше; &nbsp;механизмы компрессии и декомпрессии ресурсоемкие, а преимуществ&nbsp;в размере вы не получите.&nbsp;</div>

<h4 id="Controlling_cache">Контроль кэша&nbsp;</h4>

<p><a href="/en/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Кэширование</a>&nbsp;это способ предотвратить получение того же ресурса несколько раз, если он не менялся. Конфигурация сервера корректными хэдерами позволяет клиенту кэшировать данные соответствующим образом. Для того, чтобы это сделать, убедитесь что:</p>

<ul>
 <li>Каждый статический ресурс предоставляет&nbsp;{{ httpheader("Expires") }} хэдер в ответе и он установлен на далёкую будущую дату. Таким образом ресурс остается в кэше до тех пор, пока клиент не почистит его по своим причинам (например, при достижении предела размеров кэша).
  <div class="note"><strong>Имеем в виду: </strong>При использовании&nbsp;Apache, настройки кэширования и устанавливаются в файле&nbsp;&nbsp; .htaccess при помощи инструкции&nbsp;ExpiresDefault: <code>ExpiresDefault "access plus 1 month"</code>.</div>
 </li>
 <li>Любой динамический ресурс предоставляет хэдер {{ httpheader("Cache-control") }}. Теоритически любой&nbsp;HTTP запрос сделанный через&nbsp;<a href="/en/HTTP#Safe_Methods" title="en/HTTP#Safe Methods">безопасные&nbsp;методы</a>&nbsp;(GET или&nbsp;HEAD) или даже через &nbsp;<a href="/en/HTTP#Idempotent_Methods" title="en/HTTP#Idempotent Methods">идемпотентные</a>&nbsp;(DELETE, PUT) может быть кэширован; но на практике нужно анализировать возможный негативный побочный эффект, к которому может привести кэширование.&nbsp;</li>
</ul>

<h4 id="Setting_the_correct_MIME_types">Установка правильных MIME типов</h4>

<p>MIME это способ сказать клиенту о типе&nbsp;передаваемого&nbsp;документа: расширение файла не имеет смысла в вебе. Поэтому настройка сервера для передачи правильных&nbsp;MIME&nbsp;типов с каждым документом очень важна: клиенты (user-agents) часто используют MIME-типы для определения действия, которое нужно совершить с полученным ресурсом.</p>

<div class="note"><strong>Имеем в виду: </strong>

<ul>
 <li>На Apache сервере, заматчить расширения на соответствующие MIME типы можно в файле&nbsp;.htaccess используя инструкцию&nbsp;<font face="Verdana,Helvetica,Arial"><code><font face="courier new">AddType, пример</font><font face="Verdana, Helvetica, Arial">&nbsp;</font></code></font><code>AddType image/jpeg jpg.</code></li>
 <li>В случае пересылки ресурса не известного типа, многие серверы по умолчанию используют&nbsp;MIME&nbsp;тип&nbsp;<code>application/octet-stream</code> ; В целях безопасности, многие браузеры, такие как&nbsp;Firefox, не позволяют настроить пользовательское действие для подобных ресурсов и вынуждают пользователя сохранять их на диске для использования. Некоторые весьма распространенные случаи не корректной конфигурации серверов происходят с файлами следующих типов:&nbsp;
  <ul>
   <li>
    <p>Rar-закодированные файлы. &nbsp;В идеале было бы здорово иметь возможность установить реальный&nbsp;тип&nbsp;закодированных файлов; это часто&nbsp;не возможно ( так как сервер может и не знать типа файлов и они могут содержать несколько ресурсов разных типов) В таком случае настройте сервер так, чтобы он отправлял MIME тип&nbsp;<code>application/x-rar-compressed </code>или&nbsp;некоторые пользователи не смогут определить нужное дейстие для этих файлов.</p>
   </li>
   <li>
    <p>Аудио и видео файлы. Только ресурсы с правильным&nbsp;MIME Типом будут распознаны и проиграны, используя элементы&nbsp;{{ HTMLElement("video") }} или&nbsp;{{ HTMLElement("audio") }} . Убедитесь, что вы используете &nbsp;<a href="/En/Media_formats_supported_by_the_audio_and_video_elements" title="En/Media formats supported by the audio and video elements">правильные&nbsp;MIME типы для аудио и видео ресурсов</a>.</p>
   </li>
   <li>
    <p>Проприетарные типы файлов. Обращайте особое внимание на передачу файлов с проприетарными типами. Не забывайте добавить&nbsp;x-префикс к их типу; иначе особая обработка будет не возможна.&nbsp;&nbsp;Это особенно касается ресурсов, использующих&nbsp;<a class="external" href="https://en.wikipedia.org/wiki/Keyhole_Markup_Language" title="https://en.wikipedia.org/wiki/Keyhole_Markup_Language">Keyhole Markup Language</a>, который должен передаваться как тип&nbsp;<code>application/vnd.google-earth.kml+xml для оптимального использования.&nbsp;</code></p>
   </li>
  </ul>
 </li>
</ul>
</div>

<div class="section">
<h2 class="Community" id="Community" name="Community">Сообщество</h2>

<ul>
 <li>Mozilla форумы... {{ DiscussionList("dev-web-development", "mozilla.dev.web.development") }}</li>
</ul>

<h2 class="Tools" id="Tools" name="Tools">Инструменты</h2>

<ul>
 <li><a href="/en-US/docs/Web/API/XMLHttpRequest#getAllResponseHeaders()" title="/en-US/docs/Web/API/XMLHttpRequest#getAllResponseHeaders()"><code>XMLHttpRequest.prototype.getAllResponseHeaders()</code></a></li>
</ul>

<p><span class="alllinks"><a href="/en-US/docs/tag/HTTP:Tools" title="tag/HTTP:Tools">Смотреть все...</a></span></p>

<h2 class="Related_Topics" id="Related_Topics" name="Related_Topics">Связанные темы</h2>

<ul>
 <li><a href="/en-US/docs/Web/API/document.cookie" title="/en-US/docs/Web/API/document.cookie">document.cookie</a></li>
 <li><a href="/en-US/docs/Web/API/XMLHttpRequest" title="/en-US/docs/Web/API/XMLHttpRequest"><code>XMLHttpRequest</code></a></li>
</ul>
</div>

<h2 id="See_also">См. также</h2>

<ul>
 <li><a href="/En/Controlling_DNS_prefetching" title="En/Controlling DNS prefetching">Controlling DNS&nbsp;prefetching</a></li>
 <li>The <a href="/en/HTTP_Pipelining_FAQ" title="https://developer.mozilla.org/en/HTTP_Pipelining_FAQ">HTTP pipelining FAQ</a></li>
 <li><a href="/en/Web_Development/HTTP_cookies" title="HTTP cookies">HTTP cookies</a></li>
 <li><a href="/en-US/docs/HTTP/Headers" title="/en-US/docs/HTTP/Headers">HTTP Headers</a></li>
 <li><a href="/en-US/docs/HTTP/Basic_access_authentication" title="/en-US/docs/HTTP/Basic_access_authentication">Basic access authentication</a></li>
 <li><a href="/en-US/docs/HTTP/Access_control_CORS" title="/en-US/docs/HTTP/Access_control_CORS">HTTP access control (CORS)</a></li>
</ul>

<p>{{ languages( { "ja": "ja/HTTP"} ) }}</p>
Вернуть эту версию