Недопустимый первый параметр ($ string) в header () не влияет при использовании третьего параметра ($ http_response_code) - PullRequest
2 голосов
/ 09 октября 2011

Короткий вопрос: могу ли я положиться на поведение header('.', TRUE, 404);, header('.', TRUE, 501); и т. Д.?

Теперь позвольте мне уточнить.

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

header('HTTP/1.1 404 Bummer!'); - HTTP/1.1 404 Bummer!

header('HTTP/1.1 501 I am sick'); - HTTP/1.1 501 I am sick

header('Bummer!', TRUE, 404); - HTTP/1.1 404 Not Found

header('I am sick', TRUE, 501); - HTTP/1.1 501 Method Not Implemented

Итак, мы можем видеть, что если мы используем третий параметр, в то время как первый параметр является мусором, первый параметр игнорируется. Тем не менее, документация по http://php.net/manual/en/function.header.php гласит:

Обратите внимание, что этот параметр действует только в том случае, если строка не пустой.

Итак, нам все еще нужно что-то поместить в первый параметр. Мне это кажется немного уродливым, потому что $string игнорируется, когда мы указываем $http_response_code в третьем параметре, но мы все равно должны указать какое-то значение для $string, даже если оно никогда не будет использовано.

Но я могу понять, почему так получилось. Традиционно header() принимал только параметр, и мы могли устанавливать произвольные коды ответов, как в первых двух примерах. Второй и третий параметры были добавлены позже как необязательные параметры. Итак, мы должны указать что-то для первого параметра, если мы хотим использовать второй и третий. Более того, иногда нам может понадобиться поместить действительные заголовки в первый параметр вместе с действительным кодом ответа в третий параметр. Я включил один такой пример в конце.

Итак, я планирую использовать эту функцию в моем коде следующим образом: header('.', TRUE, 404);, header('.', TRUE, 501); и т. Д. Согласно приведенным выше примерам, будут получены правильные ответы HTTP в соответствии со стандартом. Я хочу знать, могу ли я положиться на это поведение. Я задаю этот вопрос, потому что не могу найти документацию, в которой явно указано, что первый параметр ($string) будет проигнорирован, когда мы предоставим третий ($http_response_code).

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

header('Foo: Bar', TRUE, 501); ведет к:

HTTP/1.1 501 Method Not Implemented
Date: Sun, 09 Oct 2011 19:01:19 GMT
Server: Apache/2.2.20 (Debian)
X-Powered-By: PHP/5.3.8-1
Foo: Bar
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Более практический пример - header('Location: <a href="http://example.com/there/" rel="nofollow">http://example.com/there/</a>', TRUE, 307);, который генерирует:

HTTP/1.1 307 Temporary Redirect
Date: Sun, 09 Oct 2011 19:09:29 GMT
Server: Apache/2.2.20 (Debian)
X-Powered-By: PHP/5.3.8-1
Location: http://example.com/there/
Vary: Accept-Encoding
Content-Type: text/html

В любом случае, вернемся к моему вопросу. Можно ли положиться на поведение header('.', TRUE, 404);, header('.', TRUE, 501); и т. Д.?

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

Не уверен, что если вы ищете это, но я думаю, вы не хотите строить строку статуса HTTP:

header('.', TRUE, 501);

Заставляет мой Apache возвращать эту строку состояния:

HTTP/1.1 500 Internal Server Error

Но

header(' ', TRUE, 501);

Заставляет мой Apache возвращать эту строку состояния:

HTTP/1.1 501 Not Implemented

Что может быть тем, что вы ищете.

Может быть, вы простохотите построить строку состояния?

header('HTTP/1.1 501 No Implementation for you :)');

Что заставляет мой Apache возвращать эту строку состояния:

HTTP/1.1 501 No Implementation for you :)

Традиционно это делается так:

header('HTTP/1.1 501');

Который получает текст сообщения о статусной строке по умолчанию:

HTTP/1.1 501 Method Not Implemented

Это не меняет версию протокола:

header('HTTP/1.0 404');

Как это дает:

HTTP/1.1 404 Not Found

Надеждаэто помогает.


Обновление Susam :

В PHP 5.4 простой и элегантный способ сделать это:

http_response_code(404);

или

http_response_code(501);
1 голос
/ 09 октября 2011

В настоящее время нет функции для установки только числового кода ответа HTTP. Тем не менее, я думаю, что PHP 5.4 наконец заполнит этот пробел http_response_code () .

Я бы не стал использовать header(".", TRUE, 501) сам. Он может работать на некоторых веб-серверах, но вряд ли будет работать на них всех.

...