Я пытаюсь настроить перенаправление с HTTP на HTTPS для клиентского сайта. Я добавил следующий код в файл .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Но при этом пользователи попадали на страницу 302 «Найдено» при посещении HTTP-страниц на сайте, вместо того, чтобы перенаправлять их на версию HTTPS.
Я пытаюсь выяснить, почему это происходит и как исправить проблему, чтобы получить желаемый результат. На сайте уже установлен поддомен www, что может усугубить проблему..?
Использование Apache на сервере Ubuntu.





Похоже, у вас конфликт с другими директивами. В вашем правиле отсутствует флаг 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 флаг - https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_lR флаг - https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r@JillianHoenig Я обновил свой ответ, указав более подробную информацию о флагах L и R.
Спасибо - ценю это. Я отмечу это как правильный ответ, потому что это так. Похоже, вы взяли некоторые объяснения параметров L и R из документации. Честно говоря, это немного сбивает с толку и противоречит здравому смыслу (предположим, люди, которые читают мои вопросы, не являются экспертами!), Поэтому, если вы хотите отредактировать свой ответ, чтобы предоставить удобочитаемое объяснение того, почему эти варианты применимы конкретно к моему сценарию, это будет буду очень признателен мне и сообществу!
@JillianHoenig «Похоже, вы взяли некоторые объяснения вариантов L и R из документации». - Это все мои собственные слова. Я не просматривал документацию до конца, пока не добавил справочные ссылки. «предоставить удобочитаемое объяснение» — Извините, я так и думал. Что вы считаете «сбивающим с толку и нелогичным»? По сути, вам просто не хватает флага L в этом правиле. Как я сказал в первом абзаце, флаг L указывает, что это «последнее» правило, поэтому предотвращает обработку любых последующих директив, которые в противном случае могли бы изменить/повредить перенаправление – что, похоже, и имело место.
Я думаю, что это правильный ответ, и спасибо за улучшение правила перезаписи. Для потомков, не могли бы вы рассказать, что именно здесь делают опции L и R?