.htaccess - как перенаправить ДВУ?


В настоящее время я использую свой .htaccess для принудительного преобразования всех HTTP-запросов в HTTPS, и это работает очень хорошо. Однако я также хотел бы перенаправить некоторые ДВУ. Например -

http(s)://(www.)example.info -> https://example.com или https://www.example.com

http(s)://(www.)example.net -> https://example.com или https://www.example.com

Мой текущий файл .htaccess содержит:

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Входящие запросы, которые я хотел бы перенаправить, могут быть или не быть HTTPS, и "www" может присутствовать или отсутствовать.

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

Могу ли я обернуть ранее описанные перенаправления в условное условие, которое пропустит их, если сервер localhost?

Author: MrWhite, 2018-04-20

1 answers

http(s)://(www.)example.info -> https://example.com или https://www.example.com

При прочтении вашего вопроса не похоже, что вы хотите канонизировать поддомен www? Тем не менее, вы должны быть. Решите, должно ли это быть www.example.com или example.com, и придерживайтесь этого. Для остальной части этого ответа я предположу, что www.example.com должен быть каноническим доменом.


Проще всего было бы сказать... если запрос не относится к каноническому домену, то перенаправьте его в канонический домен. Это позволит затем поймать любой из другие ДВУ и являются ли они www или нет (и даже являются ли они FQ или нет).

Например:

RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !=www.example.com
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]

Примечания по поводу вышесказанного:

  • Добавление флага OR при первом условии. Таким образом, любое из первых двух условий должно быть успешным (а не только оба из них).
  • Префикс = определяет лексикографическое точное сравнение строк. т. е. не регулярное выражение. Поэтому нет необходимости избегать буквальных точек или использовать начало/конец строки якоря.
  • Удаление круглых скобок на RewriteRule шаблон. Нет необходимости что-либо захватывать, так как вы этим не пользуетесь.
  • Добавлены флаги на RewriteRule. В конечном счете это должно быть постоянное перенаправление 301, хотя предпочтительнее сначала протестировать временное перенаправление 302 (чтобы избежать кэширования). Если вы когда-нибудь добавите больше директив, вам понадобится флаг L, чтобы остановить дальнейшую обработку.
  • Добавьте обратно два дополнения cPanel, если хотите (обязательно для АВТОМАТИЧЕСКОГО продления SSL). Или они могут быть разделены на свои собственные правила.

Могу ли я обернуть ранее описанные перенаправления в условное условие, которое пропустит их, если сервер localhost?

Существует довольно много способов заблокировать директивы из локальной разработки (которые могут зависеть от конфигурации/версии вашего сервера). Если вы просто хотите заблокировать применение этого единственного правила mod_rewrite к хосту localhost, просто добавьте другое условие:

RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !=www.example.com
RewriteCond %{HTTP_HOST} !=localhost
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]

Т.е. Только когда заголовок Host не "локальный хост".


Краткое описание

Итак, вкратце, добавив обратно условия cPanel (для АВТОМАТИЧЕСКОГО продления SSL), мы имеем:

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !=www.example.com
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]

Однако также обратите внимание на комментарий @xsrf, если вы планируете реализовать HSTS.

Смотрите также мой ответ на следующий вопрос о сервере по умолчанию для получения дополнительной информации об этих дополнительных директивах (АВТОМАТИЧЕСКОЕ обновление SSL), добавленных cPanel:
https://serverfault.com/questions/884915/apache-htaccess-multiple-rewrite-conditions-for-multiple-rules

 1
Author: MrWhite, 2018-04-25 10:14:16