Как перенаправить с http: // на https: // на https://www, не нарушая других поддоменов, которые не являются www? - PullRequest
1 голос
/ 29 марта 2019

Окружающая среда:

Wordpress работает на контейнере Docker, который создает конвейер тестирования, сначала в dev (https://dev.example.com), затем в stage (https://stage.example.com), а затем, наконец, в производство (https://www.example.com).

Обратите внимание, что и Dev, и Stage не имеют поддомен "www", а производство -.

Проблема:

По соображениям безопасности мне нужно настроить дополнительное перенаправление. В настоящее время, когда пользователь заходит на наш сайт без SSL (т. Е. http://example.com), он перенаправляется на защищенный поддомен (т. Е. https://www.example.com).

Однако в целях безопасности им необходимо нажать https://example.com , прежде чем будет перенаправлен на защищенный поддомен. Такие как:

1) http://example.com ->

2) https://example.com ->

3) https://www.example.com

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

Теперь, где я застреваю, это с этим перенаправлением и сайтами dev / stage.

Я могу получить перенаправление продукции с http://example.com -> https://example.com -> https://www.example.com с кодом ниже:

<IfModule mod_rewrite.c>
RewriteEngine On
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example.com$
RewriteRule ^ https://example.com [L,R=301]

# ensure www.
RewriteCond %{HTTP_HOST} !^www\.example.com$ [NC]
RewriteRule ^ https://www.example.com [L,R=301]
</IfModule>

Но когда этот код перемещается в dev / stage, они 502 до смерти.

Я попытался с помощью приведенного ниже кода перенаправить на www только тогда, когда сервер не www или dev или stage, но тогда перенаправление с http://example.com на https://example.com завершилось неудачей!

<IfModule mod_rewrite.c>
RewriteEngine On
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example.com$
RewriteRule ^ https://example.com [L,R=301]

# ensure www only if not dev/stage
RewriteCond %{HTTP_HOST} !^(www|dev|stage)\.example.com$ [NC]
RewriteRule ^ https://www.example.com [L,R=301]
</IfModule>

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

Любая помощь действительно приветствуется, я посмотрел здесь много других ответов, и они помогли, но я не могу пройти через сбой перенаправления dev / stage. Я застрял!


Мой полный файл htaccess:

<IfModule mod_rewrite.c>

 RewriteEngine On
 # ensure https
 RewriteCond %{HTTP:X-Forwarded-Proto} !https
 RewriteCond %{HTTPS} off
 RewriteCond %{HTTP_HOST} (^|\.)example\.com$
 RewriteRule ^/?(.*)$ https://%{HTTP_HOST}/$1 [R=302]

 # ensure www.
 RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
 RewriteCond %{HTTP_HOST} !^(www|corp-dev|corp-stage)\.example\.com$
 RewriteRule ^/?(.*)$ https://www.example.com/$1 [R=302]

# link Redirection

RewriteEngine On
RewriteRule ^health\.html$ "/health.html" [END]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Что в итоге решило эту проблему для меня:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^example.com$
  RewriteRule (.*)$ https://example.com/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^www.example.com$
  RewriteRule (.*)$ https://www.example.com/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^dev.example.com$
  RewriteRule (.*)$ https://dev.example.com/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^stage.example.com$
  RewriteRule (.*)$ https://stage.example.com/$1 [R=301,L]
</IfModule>

Мой сайт WordPress имел URL-адрес сайта на вкладке Общие настройки, установленный на https://www.example.com, и это вызывало кучу циклов с другими решениями.

Это не сработало для меня из-за настроек, о которых я упоминал, но я опубликую другое решение, которое я попробовал на случай, если оно поможет кому-то другому:

<IfModule mod_rewrite.c>
RewriteEngine On
# Redirect HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://example.com/$1 [R,L]

# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^/?(.*) https://www.example.com/$1 [R,L]
</IfModule>
0 голосов
/ 29 марта 2019

Ваша попытка почти нормальная, я только что внес несколько простых изменений:

RewriteEngine On
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} (^|\.)example\.com$
RewriteRule ^/?(.*)$ https://%{HTTP_HOST}/$1 [R=301]

# ensure www.
RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} !^(www|dev|stage)\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/$1 [R=301]

В общем, неплохо начинать тестирование с использованием перенаправления 302 и изменять его на 301, только когда все действительноза работой.Таким образом вы предотвращаете проблемы с кэшированием во время тестирования.

Это правило также будет работать в конфигурации хоста http-серверов или внутри файла динамической конфигурации (файл ".htaccess").Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на хосте http.Если вы используете динамический файл конфигурации, вам нужно убедиться, что его интерпретация вообще включена в конфигурации хоста и находится в папке хоста DOCUMENT_ROOT.

И общее замечание: вам всегда следует размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess").Эти динамические конфигурационные файлы добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера.Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

...