302 «Найдено» страница при попытке перенаправления с HTTP на HTTPS

Я пытаюсь настроить перенаправление с HTTP на HTTPS для клиентского сайта. Я добавил следующий код в файл .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

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

Я пытаюсь выяснить, почему это происходит и как исправить проблему, чтобы получить желаемый результат. На сайте уже установлен поддомен www, что может усугубить проблему..?

Использование Apache на сервере Ubuntu.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
136
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, у вас конфликт с другими директивами. В вашем правиле отсутствует флаг L (last), поэтому обработка продолжается через файл вместо запуска немедленного перенаправления.

Вы также должны указать явно и включить флаг R, который вам понадобится сделать, когда это будет изменено на 301 (постоянное) перенаправление.

Также обратите внимание, что это правило должно находиться в верхней части файла перед любыми существующими перезаписями.

Например:

:
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

Я изменил шаблон с (.*) на ^, что более эффективно, поскольку при замене не используется обратная ссылка.

Подробности о флагах L и R...

Флаг L (last) предотвращает обработку любых последующих правил mod_rewrite во время текущего прохода механизмом перезаписи. По сути, это правило last (хотя, чтобы усложнить ситуацию, это не обязательно так в сочетании с внутренними перезаписями в контексте каталога). В случае внешнего перенаправления обработка полностью останавливается, и ответ на перенаправление отправляется обратно клиенту. Флаг L (или END) почти всегда необходимо использовать с внешними перенаправлениями. (Нет разницы между L и END, когда дело касается внешних перенаправлений. END доступно только на Apache 2.4+)

Флаг R запускает внешнее перенаправление. то есть. Ответ на перенаправление отправляется обратно клиенту с HTTP-заголовком ответа Location. Если код ответа HTTP не указан, по умолчанию используется перенаправление 302 (временное). Вам необходимо указать код ответа HTTP, чтобы сделать его перенаправлением 301 (постоянным), которым в конечном итоге должно быть перенаправление HTTP на HTTPS. Обратите внимание, что 301 (постоянные) редиректы кэшируются браузерным (и, возможно, промежуточным) кешем, поэтому тестирование может быть проблематичным. По этой причине всегда сначала проверяйте перенаправления 302 (temp).

Если флаг R не включен и вы указываете абсолютный URL-адрес в строке подстановки (как вы это сделали здесь), то в большинстве систем фактически по умолчанию используется перенаправление 302 (временное). Но вам следует быть ясным и включить флаг R, чтобы заранее заявить о своем значении.

Ссылка из документации Apache:

Я думаю, что это правильный ответ, и спасибо за улучшение правила перезаписи. Для потомков, не могли бы вы рассказать, что именно здесь делают опции L и R?

Jillian Hoenig 13.03.2024 17:27

@JillianHoenig Я обновил свой ответ, указав более подробную информацию о флагах L и R.

MrWhite 13.03.2024 18:02

Спасибо - ценю это. Я отмечу это как правильный ответ, потому что это так. Похоже, вы взяли некоторые объяснения параметров L и R из документации. Честно говоря, это немного сбивает с толку и противоречит здравому смыслу (предположим, люди, которые читают мои вопросы, не являются экспертами!), Поэтому, если вы хотите отредактировать свой ответ, чтобы предоставить удобочитаемое объяснение того, почему эти варианты применимы конкретно к моему сценарию, это будет буду очень признателен мне и сообществу!

Jillian Hoenig 14.03.2024 18:28

@JillianHoenig «Похоже, вы взяли некоторые объяснения вариантов L и R из документации». - Это все мои собственные слова. Я не просматривал документацию до конца, пока не добавил справочные ссылки. «предоставить удобочитаемое объяснение» — Извините, я так и думал. Что вы считаете «сбивающим с толку и нелогичным»? По сути, вам просто не хватает флага L в этом правиле. Как я сказал в первом абзаце, флаг L указывает, что это «последнее» правило, поэтому предотвращает обработку любых последующих директив, которые в противном случае могли бы изменить/повредить перенаправление – что, похоже, и имело место.

MrWhite 15.03.2024 16:50

Другие вопросы по теме