Короткий вопрос: могу ли я положиться на поведение 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);
и т. Д.?