Поддомен перенаправления поддомена Apache на поддомен

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

Например:

  • customer1.domain.com

  • customer2.domain.com

Поэтому мы купили подстановочный SSL-сертификат для * .domain.com и перенаправили все поддомены с http на https.

Пока все просто, но теперь у нас есть клиенты, которые вручную набирают www.customer1.domain.com в своем браузере, так как этого виртуального хоста не существует.

Теперь я хочу перенаправить все запросы с http://www.wildcard.domain.com на https://wildcard.domain.com

Наш vhost выглядит так:

<VirtualHost {{IP-ADRR}}:443>
  Servername %1.domain.com
  VirtualDocumentRoot /path/to/webroot/%0
  Include  /etc/httpd/conf/options-ssl-standard.conf
</VirtualHost>

Наше перенаправление для всех HTTP-запросов на одну и ту же цель на HTTPS выглядит так:

<Virtualhost {{IP-ADRR}}:80>
  ServerName %1.domain.com
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

person AK47-Design    schedule 01.09.2017    source источник
comment
Что, если пользователь перейдет на http s: //www.wildcard.domain.com? Ваше решение, приведенное ниже, работает?   -  person jeff-h    schedule 25.01.2018


Ответы (1)


Решение для перенаправления:

<Virtualhost {{IP-ADRR}}:80>
  ServerName %1.domain.com
  RewriteEngine On
  RewriteCond %{HTTPS} off [OR]
  RewriteCond %{HTTP_HOST} ^www\. [NC]
  RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
</VirtualHost>

Объяснение:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]

Эти две строки являются условиями перенаправления, они используются для определения необходимости перенаправления запроса. Поскольку условия объединены оператором [ИЛИ], если любое из этих двух условий вернет истину, Apache выполнит правило перезаписи (перенаправление).

Первое условие определяет, использует ли запрос URL-адрес, отличный от HTTPS. Второе условие определяет, использует ли запрос URL-адрес www. Обратите внимание, что я использовал www \. а не www., потому что шаблон является регулярным выражением, а расширение. точка имеет здесь особое значение, поэтому ее нужно экранировать.

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]

Четвертая строка - это удобная строка, которую я использовал, чтобы не указывать имя хоста непосредственно в URL-адресе. Он соответствует HOST входящего запроса и раскладывает его на часть www (если есть) и остальную часть имени хоста. Мы будем ссылаться на него позже с% 1 в RewriteRule.

RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

RewriteRule - это сердце перенаправления. С помощью этой строки мы говорим Apache перенаправлять любой запрос на новый URL-адрес, состоящий из:

  • https://www.
  • % 1: ссылка на часть хоста без www
  • % {REQUEST_URI}: URI запроса без имени хоста

Все эти токены объединяются и представляют собой окончательный URI перенаправления. Наконец, мы добавляем 3 флага:

  • NE, чтобы не экранировать специальные символы
  • R = 301 для использования статуса перенаправления HTTP 301
  • L, чтобы остановить обработку других правил и немедленно перенаправить
person AK47-Design    schedule 05.09.2017
comment
Вам не нужно RewriteCond %{HTTPS} off [OR] для vhost, прослушивающего порт 80. Порт 80 предназначен для незашифрованного HTTP, и пользователь, который набирает https://www.example.com:80/, никогда не завершит рукопожатие HTTPS с сервером, поэтому перезапись все равно не вступит в силу. - person Ben Stern; 08.07.2018