HTTP код статуса: Ответить с 101 или 301?

Вопрос или проблема

Мы можем принудительно использовать SSL на серверах Apache с помощью следующей конфигурации:

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Здесь мы говорим серверу Apache вернуть ответ 301 Перемещено навсегда клиенту. Но существует и другой статус 101 Переключение протоколов, и я думаю, что этот статус более подходит, так как мы переключаемся с обычного HTTP на HTTPS.

Я прав? Есть ли что-то неправильное? Какой код состояния мне следует использовать?

Правильный код состояния, который следует использовать здесь, безусловно, 301 Перемещено навсегда.

101 Переключение протоколов — это внутренний код состояния, который сервер обычно использует для автоматического согласования определенных типов соединений. Он не используется при изменении URL с http на https. Если вам интересно, как это работает, вы можете прочитать о коде состояния 101 и механизме обновления протокола на MDN, но вам никогда не нужно будет знать об этом как веб-мастеру.

В общем, вам никогда не следует напрямую использовать коды состояния серии 100, если вы фактически не разрабатываете программное обеспечение для веб-серверов. Код состояния 300 и 400 (особенно 301, 302 и 404) — это те коды, на которые вам следует обратить внимание при управлении простым веб-сайтом.

Нет – 101 Переключение протоколов не подходит для перенаправления на HTTPS, так как этот статус указывает на то, что текущее соединение должно быть обновлено до нового протокола, тогда как перенаправление инструктирует клиента (браузер) повторить запрос на новом месте.

Замешательство может возникнуть из-за того, что, с вашей точки зрения, эти два места находятся по одному и тому же адресу, единственное отличие — это используемый протокол/номер порта. Однако с точки зрения схемы URI это два отдельно адресуемых места (так как протокол является частью адреса), поэтому перенаправление является правильным методом.

При запросе обновления заголовок 101 Переключение протоколов выводится, а затем сервер немедленно переключается на использование нового протокола на том же соединении.

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Мне кажется, что более простой regex .* должен работать так же хорошо.

Здесь мы говорим серверу Apache вернуть ответ 301 Перемещено навсегда клиенту. Но существует и другой статус 101 Переключение протоколов, и я думаю, что этот статус более подходит, так как мы переключаемся с обычного HTTP на HTTPS.

Нет, правильный код состояния — 301, по двум причинам:

  1. Это перенаправление. Согласно RFC 7231, раздел 6, перенаправления указаны серией кодов состояния 3xx. Раздел 6.4.2 определяет код состояния 301 Перемещено навсегда, который явно является подходящим для перенаправлений HTTP → HTTPS.
  2. Apache не воспринимает перенаправления с кодами состояния вне серии 3xx:

Однако, если код состояния находится вне диапазона перенаправления (300-399), то строка замены полностью отбрасывается, и переписывание останавливается так, как если бы использовалась L.

Перенаправление инструктирует веб-браузер создать новый HTTP-запрос. В этом случае этот запрос требует нового соединения с новым источником: изменение схемы или порта меняет источник, и в этом случае вы меняете оба. Это очень отличается от 101 Переключение протоколов, который немедленно вызывает переключение текущего соединения на другой протокол. Этот другой протокол может быть любым (по соглашению между сервером и клиентом), но, вероятно, не имеет ничего общего с HTTP!

Ответ или решение

Вопрос о том, какой HTTP-статус-код использовать в процессе переноса с протокола HTTP на HTTPS, особенно важен для обеспечения корректного функционирования веб-сайта и его взаимодействия с пользователями. Рассмотрим двусмысленность между статусами 101 Switching Protocols и 301 Moved Permanently.

Почему следует использовать 301 Moved Permanently

  1. Суть перенаправления: Код статуса 301 обозначает, что ресурс был перемещен навсегда. Это идеальный вариант для перенаправления пользователей и поисковых систем с HTTP на HTTPS. Этот код гарантирует, что браузеры и поисковые системы обновят свои записи, перейдя на новую, безопасную версию URL.

  2. Стандарты и спецификации: Согласно RFC 7231, секция 6, все перенаправления должны использовать статус-коды из диапазона 3xx, и статус-код 301 конкретно предназначен для обозначения постоянного перемещения ресурса. Использование этого кода позволяет серверам корректно обрабатывать реакции на запросы и гарантирует, что клиенты (включая поисковые системы) будут использовать новую версию ресурса в своих запросах.

  3. Технические ограничения Apache: Сервер Apache не поддерживает перенаправления с кодами статуса, выходящими за пределы диапазона 300-399. Если используется статус-код, отличный от 3xx, правила замены игнорируются. Это означает, что ваш RewriteRule не будет выполнен, если будет использован неправильный код состояния.

Почему 101 Switching Protocols не подходит

Статус-код 101 Switching Protocols служит для сигнализации о том, что клиент запросил изменение протокола на существующем соединении, например, при использовании WebSocket. Это не для перенаправления на другой протокол (илиURL). Вот основные причины, почему данный статус не следует использовать для перехода с HTTP на HTTPS:

  • Смена соединения: Код 101 говорит о том, что вы изменения на текущем соединении, в то время как при переходе с HTTP на HTTPS фактически создается новое соединение — с новым протоколом и, возможно, новым адресом. Это два различных ресурса, и механизм перенаправления является наиболее подходящим для обработки этого сценария.

  • Отсутствие применения в веб-администрировании: Как упоминалось, статусы из серии 100 не предназначены для вебмастеров и администраторов сайтов, их использование встречается редко и обычно ограничивается разработкой веб-сервера.

Что выбрать

Вывод прост: для переадресации с одного протокола на другой, особенно когда речь идет о переходе к более безопасному (HTTPS), стоит выбирать статус-код 301 Moved Permanently. Это обеспечит надлежащую работу вашего сайта, повысив его уровень доверия со стороны пользователей и улучшив SEO.

В заключение, настроив RewriteRule в конфигурации вашего Apache-сервера с использованием кода 301, вы обеспечите безопасность и надежность вашего веб-ресурса, создавая положительный пользовательский опыт и соответствуя требованиям поисковых систем.

Оцените материал
Добавить комментарий

Капча загружается...