Для того, чтобы отправить страницу пользователю, её надо сопроводить определенными http заголовками, но что именно формирует эти заголовки: сервер-программа или интерпретатор php? Раньше был уверен в том, что этим занимается сервер, но потом узнал, что при написании скриптов на других языках обязательно надо писать заголовки перед остальным выводом, в то время как в php функция header() вовсе не обязательна.
Почему в других языках надо выводить заголовки вручную тогда, если они работают на одних и тех же серверах?
Эти настройки задаются в php.ini? И правильно ли я понял, что php интерпретатор сам подгоняет скрипт, чтобы он соответствовал cgi интерфейсу?
Осн. заголовки бэком формируются. Сервер может добавлять или переопределять заголовки, если нужно. Прежде всего. Но у пыха может быть и «пользовательский конфиг». Плюс на пых можно напрямую влиять из конфигов сервера, если он работает, как модуль сервера.
Пых - это язык, разработанный специально для веба, естественно, в нём многое сделано, чтоб избавить программиста от необходимости думать о таких низкоуровненных штуках. Хотя иногда приходится
@Джорджио отлично, вот смотри, заголовок Pragma вообще не обязателен. Зато здесь упущен обязательный заголовок с кодом ответа (200 OK). Потому что весь необходимый минимум будет отправлен http-сервером, обслуживающим CGI. То что здесь приведены для демонстрации заголовки не говорит о том, что их обязательно нужно отправлять из CGI.
То есть, при связи скрипта с веб-сервером по интерфейсу cgi(который встроен в интерпретатор php), вывод скрипта автоматически дополняется заголовками? И ещё один вопрос, это из-за того, что в компиляторе Си не предусмотрен cgi интерфейс, заголовки можно выводить как обычные строки, а не в функция типо location()
@Джорджио ты можешь заметить в выводе \n то есть пустую строку. Всё до пустой строки считается загловками, всё что после - телом. Так вот, php-функция header() пишет строки до пустой строки, а всё остальное провоцирует php на автоматический вывод такой пустой строки, после этого весь вывод это контент страницы и невозможно отправить заголовок.
Только по RFC разделитель строк (маркер конца строки) – \r\n (CRLF), хотя в никсах иногда работает прозрачная подмена. Плюс есть такая рекомендация: --- Добавлено --- Ну и на пыхе обычным способом выводится сразу контент. Хардкодить заголовки приходится в редких случаях, например при отправке мыла.
То есть компилятор Си в отличае от компилятора php не разделяет вывод в заголовки и в контент, поэтому все можно писать единым выводом?
@Джорджио компилятор тут вообще не причем. HTTP это просто текст, всё зависит от того, как появляется разделитель.
Так разве не компилятор устанавливает этот самый разделитель(В php он его ставит между выводом всех header() и выводом echo, а компиляторы других языков этого не делают, поэтому и выводить заголовки можно обычными командами вывода, но и разделитель приходится печатать вручную) --- Добавлено --- К тому же есть еще и консольный режим компилятора php, который выполняет скрипт в консоли, а не преобразует его в cgi. Этот компилятор вообще никак не реагирует на header()
@Джорджио, язык C - штука гиперуниверсальная, его компилятор вообще не знает, что он компилирует, веб-приложение, десктоп или операционную систему, php - разработанный специально, чтобы сайтики делать. Хотя, думаю, что для C тоже должны быть библиотеки, которые все заголовки посылают одной строчкой. Котеров эти листинги C привёл с целью показать, как работает HTTP протокол. И мне кажется, язык C он привёл напрасно. Всё можно было чисто текстом и парой схем объяснить. --- Добавлено --- Стандартный PHP - это не компилятор, это интерпретатор. Ну в консоли заголовки не нужны, я думаю, header() проверяет, в консоли она запущена, или по запросу веб-сервера, и в консоли ничего не делает.
Я читал эту книгу. Котлеров привел код на С с целью показать, что в принципе на С возможно написать подобный скрипт и насколько проще то же самое реализовать на пыхе. Дальше по тексту он приводит тот же самый скрипт на пыхе