Обновился HTTP/1.1

    Вот так неожиданно, через 15 лет после начальной публикации, обновилась спецификация HTTP/1.1
    Обновлений много, я бы даже сказал, дофига. Добавили много проясняющего текста, разбили спецификацию на 6 RFC (раньше было 2), добавили новый статус 308, стандартизировали X-Forwarded-For (теперь он просто Forward), и еще много всего.

    Неполный спискок изменений:
    • Новый статус 308 — Permanent Redirect, но с отправкой этих же самых данных. Т.е. запрос не меняется на GET, как раньше.
    • Новый заголовок Forward, который призван заменить X-Forwarded-For и X-Forwarded-Proto
    • Убрано ограничение на 2 подключения к серверу
    • Убрана поддержка HTTP 0.9
    • Убрана кодировка ISO-8859-1 по умолчанию
    • Убран заголовок Content-MD5
    • Запрет использования Content-Range на POST-запросах
    • Добавлено кеширование кодов 204, 404, 405, 414 и 501
    • Изменена документация кодов 301 и 302 таким образом, чтобы позволить перенаправлять метод с POST на GET. Т.е. задокументировали текущую реализацию всех браузеров.
    • Добавлены разграничения между запретом отправки referer и случаем, когда referer нет. Теперь следует отправлять Referer: about:blank, если referer-а не было.
    • Location теперь может перенаправлять на ссылку с хештегом.


    Новые RFC:
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 40

      +1
      308 — давно пора!

      Location на хэштег — хм, оно же и сейчас вполне работает?
        +2
        Location на хэштег — хм, оно же и сейчас вполне работает?

        Задокументировали, наверное.
          +3
          в сафари на маке, как минимум, не работает.
        +4
        Здорово, супер! Да и мысли здравые! Но почему, почему было не назвать его «1.2»?

        «Переписывание истории» — то, за что ругают политиков, а здесь такое переписывание не чего-нибудь, а стандарта. Так теперь и будем говорить, писать и читать — «ПО поддерживает HTTP 1.1, притом не только старый, но и новый».
          +10
          Потому, что HTTP/1.2 это совсем другая спецификация (он уже существует). По сути, они просто задокументировали все, что было непонятно/неясно, или что использовали, а в документации не было. Ничего кардинально нового тут нет.
            +12
            Например, «Referer: about:blank» что-то новое и мне совершенно не нравится.
              0
              Наоборот. Наконец-то вносит ясность, особенно в случае с Opera, которая часто реферера глотает.
              +13
              HTTP 1.1.1. ;-)
                0
                HTTP/1.1.1.1
                HTTP/1.1.1.1.1
                HTTP/1.1.1.1.1.1
                и т.д.
                  +3
                  Нет, но потом-то можно 1.1.2.
                0
                Ну, это Вы формально ответили, и, да, 1.2, конечно, существует, я маху дал.

                Но давайте не будем цепляться к номеру версии, давайте по сути: изменений и уточнений много. Мне было бы спокойнее иметь в номере версии какое-то указание, говорим ли мы о «старом HTTP 1.1», или о «новом HTTP 1.1». Не говоря, что, задумай разработчики выкатить еще одну редакцию, совсем голову сломаем при выборе «старый», «новый», «совсем новый».

                Согласен на «1.1bis», на предложенный ниже «1.1.1», даже на «1.1 R2», но все равно какая отметка о «ревизии» должна быть, я так понимаю.

                Вот сейчас пойдет волна обновлений веб-серверов, и в каждой новости будем читать в разделе «изменения» — «появилась поддержка новой версии протокола HTTP/1.1 и изменений, к старому HTTP/1.1 добавленных».
              +25
              Среди всего технического, about:blank выглядит очень подозрительно.
                0
                Да, еще одна какая то не кошерная проверка чисто для HTTP/1.1.
                  +1
                  А что не так?
                    +1
                    А зачем оно? Для чего различать тех пользователей, которые блокируют отправку Referer?
                      +2
                      Для того чтобы понимать — вбил пользователь адрес в браузер или открыл ссылку из окна без адреса.
                        +7
                        Вот это меня и беспокоит. Зачем в протокол закладывать ещё большую автоматическую передачу каких-то данных о пользователе и его действиях?
                          0
                          Что-то я вас не понимаю. Referer предназначен для передачи откуда пользователь перешёл. Такая логика у него. К сожалению, в логике был изъян: если адрес окна about:blank, то браузеры его не передавали в этот заголовок, такое непонятное исключение. Сейчас логику выправили, исключения нет.
                            +1
                            У меня аж целых два возражения:

                            1. Referer не передаётся по ссылкам с локальных страниц (например, я создал документ C:\123.HTML со ссылкой на ya.ru — при переходе по ссылке firefox не передаёт referer). Разве about:blank не локальный ресурс? Получается, при «переходе» с about:blank (взял в кавычки, т.к. перехода по ссылке собственно нет) надо передавать локальный referer, а при переходе с C:\123.HTML — не надо?

                            2. Referer не показывает, откуда пришёл пользователь, он показывает атрибут href последнего кликнутого тега <a>. Например, переход через <meta http-equiv="refresh" />, или window.location="...". Можно сделать вывод, что referer относится только к переходам по тегу <a href="...">. В случае пустой страницы анкора нет, referer не нужен.
                              0
                              Например, переход через ...
                              отвлёкся на другие окна, чтобы проверить, забыл дописать «не передаёт referer»
                                +1
                                Referer не показывает, откуда пришёл пользователь, он показывает атрибут href последнего кликнутого тега <a>
                                Это не совсем верно. Например, если страница содержит картинку, то запрос к картинке будет содержать Referer-заголовок с адресом всей страницы.
                                  0
                                  Верно. Получается, у referer нет целостного назначения. Как «исторически сложилось», так и работает.
                                  0
                                  Как это перехода с about:blank нет? Открывает about:blank, потом наш js-шаблонизатор туда пишет содержимое, и вот, есть переход.
                                  +1
                                  Это-то понятно. Непонятно, зачем? Кому эта ситуация мешала? Поставлять лишний бит информации в байесовскую сеть кровавой АНБни о том, что кто-то режет Referer`ы?
                                    0
                                    Если кто-то режет, он начнёт подставлять «about:blank» вместо полного удаления. Расширение RefControl уже сейчас может подставлять custom referer или полностью удалять.

                                    Таким образом, различие коснётся только ссылок с rel="noreferrer". Вот, спрашивается, зачем тогда этот атрибут вводить, чтобы потом искать к нему противодействие.

                                    Как-то это не в духе открытых стандартов: вводить сначала фичу, потом к ней антифичу. Это как гугль/яндекс стали «шифровать» поисковый запрос в referer при переходе по ссылке-результату поиска. Пока им было выгодно, их всё устраивало.
                                    +1
                                    а если у меня не about:blank в адресной строке, а habr.ru, а я туда вручную пишу другой адрес?
                                      +3
                                      Вы меня с автором RFC перепутали что ли?
                                        +1
                                        Но вы же взялись объяснить его логику.
                                          0
                                          Ответ на ваш вопрос есть в RFC.
                                  +1
                                  Что ещё за «окно без адреса»?

                                  Насколько я понимаю, ситуаций когда Referer не передаётся три:
                                  1. браузер запустили с параметром url (ну или нажали на ссылку в каком-то другом приложении, напр. в IM-клиенте, и это приложение запустило браузер по умолчанию с указанной url или передало ему команду через какое-нить IPC/dbus)
                                  2. пользователь открыл новую вкладку/окно и набрал url
                                  3. пользователь заблокировал отправку referer (напр. плагином FF RefControl) либо url выкачивается не браузером, а какой-то качалкой вроде wget/curl

                                  Я предполагаю, что разница между первыми двумя слишком тонкая и техническая (в обоих случаях идёт открытие url не связанной с уже открытыми страницами, а наличие/отсутствие на экране надписи about:blank в строке адреса не несёт никакой реальной смысловой нагрузки), поэтому данное изменение протокола подразумевает что Referer: about:blank будет передаваться в первых двух случаях и не передаваться в третьем.
                                    0
                                    Во времена расцвета сетей dc++ была занятная история, связанная с первым сценарием.
                                    Веб-ресурсы рекламировались в чате dc-хаба. Но при переходе по ссылке из чата неизвестно было, откуда пришёл юзер.
                                    А хотелось бы, чтобы всякая аналитика показывала хаб как источник трафика.
                                    В-общем, держатели хабов и разработчики dc-клиентов в дискуссиях на формумах так ничего и не придумали.
                                      +2
                                      А что, подменять все отправляемые в чат ссылки на hub.example.com/r?ORIGINALURL не было технической возможности?
                                        0
                                        Не было возможности указать разный href и title в ссылке. Адрес с редиректом некрасиво смотрится в коротком текстовом объявлении.
                                      +1
                                      Что ещё за «окно без адреса»?
                                      var h = window.open('about:blank'…);
                              +17
                              Код 451 не включили в стандарт? Неужели никто не предложил такую правку?
                                +4
                                Код 451 предлагали с 2012 года, tools.ietf.org/html/draft-tbray-http-legally-restricted-status-04 ("An HTTP Status Code to Report Legal Obstacles") — пятая версия предложения (истекает через месяц) от Tim Bray (Google, ранее Sun и создание XML).
                                  +1
                                  http2.0 конечно, вкуснее, но тоже хорошо… только что-то меня волнует, что если нету реферрера — about:blank, вроде ничего, но какие-то подозрения.
                                    –6
                                    Собрание параноиков какое-то…
                                      +2
                                      Это не мы такие, это жизнь такая. ☺
                                        0
                                        В IE12 старый referer без about:blank будет передаваться в освободившемся X-Forwarded-For

                                  Only users with full accounts can post comments. Log in, please.