Заголовок 404 - HTTP 1.0 или 1.1? - PullRequest
19 голосов
/ 05 мая 2010

Почему почти каждый пример, который я могу найти (включая этот вопрос примерно год назад), говорит, что заголовок 404 должен быть HTTP/1.0 404 Not Found, когда мы действительно использовали HTTP 1.1 более десяти лет ? Есть ли причина не отправлять HTTP/1.1 404 Not Found вместо этого?

(Не то чтобы это так много значило ... Мне в основном просто любопытно.)

Ответы [ 6 ]

28 голосов
/ 30 сентября 2011

В PHP вы, вероятно, должны использовать:

header( $_SERVER['SERVER_PROTOCOL']." 404 Not Found", true );

или даже лучше

header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true );

(если поддерживается) и, таким образом, оставьте веб-серверу, какой протокол использовать.

На самом деле, если вы передадите код состояния в качестве 3-го параметра, вы можете передать все, что захотите, в 1-м, если он не пустой, а PHP сделает все остальное. Смотри http://php.net/header

header("foobar", true, 404 );

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

6 голосов
/ 05 мая 2010

Использование версии HTTP может основываться на следующих факторах:

  • Ваш веб-сервер поддерживает HTTP 1.0 или 1.1
  • Поддержка веб-браузером HTTP 1.0 или 1.1
  • Ваше предпочтение как веб-разработчика, какую версию протокола использовать

Современные браузеры могут хорошо поддерживать как 1.0, так и 1.1, и клиент и сервер согласятся на самую высокую версию, которую могут поддерживать одновременно Основные различия между протоколом 2 можно найти: http://www8.org/w8-papers/5c-protocols/key/key.html

Однако нет никаких ключевых различий в использовании 404 Not Found. Однако будьте последовательны для всего вашего сайта. то есть, если вы используете HTTP / 1.1, вы используете его на своем веб-сайте.

2 голосов
/ 05 мая 2010

Я бы подумал, что ответ должен быть HTTP/1.0 404 Not Found, если запрос был HTTP 1.0, и HTTP/1.1 404 Not Found, если запрос был HTTP 1.1.

На практике серверам будет легче возвращать постоянные ответы, и ответ HTTP 1.0 будет понятен как для клиентов 1.0, так и для 1.1, поэтому безопаснее всего его вернуть. Если вы знаете, что клиент понимает 1.1 (например, потому что это то, что он просил), тогда ответ 1.1 должен работать.

Возможно, будьте осторожны и отправьте ответ 1.0.

2 голосов
/ 05 мая 2010

Это не имеет большого значения. Клиент отвечает за сообщение серверу, какую версию HTTP он использует. Затем сервер должен ответить с той же версией. Это не всегда происходит; Я только что получил ответ от сервера:

$ telnet example.com 80
Trying 123.123.123.123...
Connected to example.com.
Escape character is '^]'.
GET /fork HTTP/1.0

HTTP/1.1 404 Not Found
Content-Length: 1635
Content-Type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Tue, 04 May 2010 22:30:36 GMT
Connection: close

Я попросил сервер использовать HTTP 1.0, но он пошел дальше и ответил HTTP 1.1.

1 голос
/ 05 мая 2010

Рассматривая как RFC 1.1, так и 1.0, 404 присутствует в обоих - так что, вероятно, нет другой причины, кроме того, что сервер сообщает клиенту, что он работает на http 1.1.

Тем не менее - если сервер отвечает 404 по протоколу Http 1.1, это означает, что он мог бы вернуть 410 - Ушел вместо того, чтобы указать ресурс, который раньше существовал, но больше не делает. Этот код состояния не является частью 1.0, и поэтому эта информация может быть полезной для клиента (особенно для веб-сканеров).

РЕДАКТИРОВАТЬ

Извините - этот ответ, вероятно, отвечает наоборот! Я полагаю, что вы, вероятно, можете рассчитывать лишь несколькими руками на количество общедоступных веб-серверов, которые будут беспокоиться о запоминании всех ресурсов, которые раньше существовали и которых больше нет (ни в коем случае я бы не кодировал это на своем веб-сервере!) поэтому, вероятно, лучше всего ответить 1,0404, чтобы указать, что «его просто нет», а не «его здесь нет», но другие вещи на сайте, возможно, раньше были, но не больше - в этом случае я мог бы отправить вас 410 '.

Существует также тот факт, что вы разрешаете клиентам только 1.0 работать с вашим сайтом.

Тем не менее - все это немного педантично.

0 голосов
/ 27 июня 2018

В современных версиях PHP вы также можете использовать функцию http_response_code и полностью обойти проблему!

Мне также нравится этот метод, потому что это означает, что нет риска сделать опечатки в ответном сообщении.

...