За последние 24 часа нас посетили 22753 программиста и 1208 роботов. Сейчас ищут 705 программистов ...

Как формируются http заголовки?

Тема в разделе "PHP для новичков", создана пользователем Джорджио, 30 май 2019.

Метки:
  1. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    Для того, чтобы отправить страницу пользователю, её надо сопроводить определенными http заголовками, но что именно формирует эти заголовки: сервер-программа или интерпретатор php?
    Раньше был уверен в том, что этим занимается сервер, но потом узнал, что при написании скриптов на других языках обязательно надо писать заголовки перед остальным выводом, в то время как в php функция header() вовсе не обязательна.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Комби. Сервер может добавлять или переопределять заголовки, т.к. он «фронт».
     
  3. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    Почему в других языках надо выводить заголовки вручную тогда, если они работают на одних и тех же серверах?
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Пых сам формирует осн. заголовки, учитывая свои настройки, например Content-Type: text/html.
     
    Dmitry Lazarev нравится это.
  5. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    Эти настройки задаются в php.ini?
    И правильно ли я понял, что php интерпретатор сам подгоняет скрипт, чтобы он соответствовал cgi интерфейсу?
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Осн. заголовки бэком формируются. Сервер может добавлять или переопределять заголовки, если нужно.

    Прежде всего. Но у пыха может быть и «пользовательский конфиг». Плюс на пых можно напрямую влиять из конфигов сервера, если он работает, как модуль сервера.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Кстати, можно влиять напрямую и через CGI, устанавливая PHP_VALUE и т.п.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Пых - это язык, разработанный специально для веба, естественно, в нём многое сделано, чтоб избавить программиста от необходимости думать о таких низкоуровненных штуках. Хотя иногда приходится
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Например?
     
  10. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    Вот, к примеру листинг из книги "php 7 в подлиннике" Котерова, глава про cgi интерфейс
    upload_2019-6-3_0-55-51.png
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Джорджио отлично, вот смотри, заголовок Pragma вообще не обязателен. Зато здесь упущен обязательный заголовок с кодом ответа (200 OK). Потому что весь необходимый минимум будет отправлен http-сервером, обслуживающим CGI. То что здесь приведены для демонстрации заголовки не говорит о том, что их обязательно нужно отправлять из CGI.
     
  12. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    То есть, при связи скрипта с веб-сервером по интерфейсу cgi(который встроен в интерпретатор php), вывод скрипта автоматически дополняется заголовками? И ещё один вопрос, это из-за того, что в компиляторе Си не предусмотрен cgi интерфейс, заголовки можно выводить как обычные строки, а не в функция типо location()
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Джорджио ты можешь заметить в выводе \n то есть пустую строку. Всё до пустой строки считается загловками, всё что после - телом. Так вот, php-функция header() пишет строки до пустой строки, а всё остальное провоцирует php на автоматический вывод такой пустой строки, после этого весь вывод это контент страницы и невозможно отправить заголовок.
     
    artoodetoo нравится это.
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Только по RFC разделитель строк (маркер конца строки) – \r\n (CRLF), хотя в никсах иногда работает прозрачная подмена. Плюс есть такая рекомендация:
    --- Добавлено ---
    Ну и на пыхе обычным способом выводится сразу контент. Хардкодить заголовки приходится в редких случаях, например при отправке мыла.
     
  15. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    То есть компилятор Си в отличае от компилятора php не разделяет вывод в заголовки и в контент, поэтому все можно писать единым выводом?
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Джорджио компилятор тут вообще не причем. HTTP это просто текст, всё зависит от того, как появляется разделитель.
     
  17. Джорджио

    Джорджио Новичок

    С нами с:
    17 апр 2019
    Сообщения:
    11
    Симпатии:
    0
    Так разве не компилятор устанавливает этот самый разделитель(В php он его ставит между выводом всех header() и выводом echo, а компиляторы других языков этого не делают, поэтому и выводить заголовки можно обычными командами вывода, но и разделитель приходится печатать вручную)
    --- Добавлено ---
    К тому же есть еще и консольный режим компилятора php, который выполняет скрипт в консоли, а не преобразует его в cgi. Этот компилятор вообще никак не реагирует на header()
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Джорджио, язык C - штука гиперуниверсальная, его компилятор вообще не знает, что он компилирует, веб-приложение, десктоп или операционную систему, php - разработанный специально, чтобы сайтики делать. Хотя, думаю, что для C тоже должны быть библиотеки, которые все заголовки посылают одной строчкой. Котеров эти листинги C привёл с целью показать, как работает HTTP протокол. И мне кажется, язык C он привёл напрасно. Всё можно было чисто текстом и парой схем объяснить.
    --- Добавлено ---
    Стандартный PHP - это не компилятор, это интерпретатор. Ну в консоли заголовки не нужны, я думаю, header() проверяет, в консоли она запущена, или по запросу веб-сервера, и в консоли ничего не делает.
     
    Dmitry Lazarev нравится это.
  19. Dmitry Lazarev

    Dmitry Lazarev Новичок

    С нами с:
    17 май 2019
    Сообщения:
    7
    Симпатии:
    0
    Я читал эту книгу. Котлеров привел код на С с целью показать, что в принципе на С возможно написать подобный скрипт и насколько проще то же самое реализовать на пыхе. Дальше по тексту он приводит тот же самый скрипт на пыхе