VirtualHost вызывает ERR_TOO_MANY_REDIRECTS после установки сертификатов LetsEncrypt - PullRequest
0 голосов
/ 22 октября 2018

Редактировать: я удалил строки перенаправления из VirtualHosts для двух доменов, которые не работают.После перезагрузки Apache обе версии сайтов HTTP и HTTPS работают должным образом, но их перенаправление больше не выполняется (очевидно).Но те же самые точные правила перенаправления работают нормально для sidmandesign.com

Я перенесу свой веб-сервер с сервера IIS в стек LAMP с помощью Ubuntu.Я использовал certbot для установки трех SSL-сертификатов для моих трех доменов.Certbot добавил файл -le-ssl.conf в каталог virtualhosts, так что там у меня теперь есть (все в / etc / apache2 / sites-enabled / directory с правильным включением в apache.conf):

sidmandesign.conf:

<VirtualHost *:80>
   ServerName www.sidmandesign.com
   ServerAlias sidmandesign.com
   DocumentRoot "/var/www/html/Sidman Designs/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =sidmandesign.com [OR]
RewriteCond %{SERVER_NAME} =www.sidmandesign.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

sidmandesign-le-ssl.conf:

<VirtualHost *:443>
    ServerName www.sidmandesign.com
    ServerAlias sidmandesign.com
    DocumentRoot "/var/www/html/Sidman Designs"

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/sidmandesign.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/sidmandesign.com/privkey.pem
</VirtualHost>

augustinebuilders.conf:

<VirtualHost *:80>
   ServerName www.augustinebuilders.com
   ServerAlias augustinebuilders.com
   DocumentRoot "/var/www/html/augustine/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =augustinebuilders.com [OR]
RewriteCond %{SERVER_NAME} =www.augustinebuilders.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

augustinebuilders-le-ssl.conf:

<VirtualHost *:443>
    ServerName www.augustinebuilders.com
    ServerAlias augustinebuilders.com
    DocumentRoot "/var/www/html/augustine"

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/augustinebuilders.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/augustinebuilders.com/privkey.pem
</VirtualHost>

salvagedserendipity.conf:

<VirtualHost *:80>
   ServerName www.salvagedserendipity.com
   ServerAlias salvagedserendipity.com
   DocumentRoot "/var/www/html/salvagedserendipity/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =salvagedserendipity.com [OR]
RewriteCond %{SERVER_NAME} =www.salvagedserendipity.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

salvagedserendipity-le-ssl.conf:

<VirtualHost *:443>
    ServerName www.salvagedserendipity.com
    ServerAlias salvagedserendipity.com
    DocumentRoot "/var/www/html/salvagedserendipity"

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/salvagedserendipity.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/salvagedserendipity.com/privkey.pem
</VirtualHost>

Sidmandesign.com работает отлично, он перенаправляет наHTTPS и я все вижу.Однако, когда я пробую другие два сайта, они перенаправляют на HTTPS, но я получаю ERR_TOO_MANY_REDIRECTS в Chrome, и универсальный не может отобразить эту страницу в Edge / IE.

Любые идеи, почему один домен будет работать, но два других некогда конфиги выглядят одинаково?

1 Ответ

0 голосов
/ 23 октября 2018

Ваш RewriteCond синтаксис

В вашем *: 80 VirtualHost удалите директивы RedirectCond и RewriteRule и добавьте (что ж, настройте для своих доменов!):

Redirect permanent / https://www.example.com

Нет необходимости проверять соответствие доменных имен, Apache будет использовать конфигурацию в этом VirtualHost только в том случае, если домен соответствует значениям директив ServerName или ServerAlias в любом случае.

Еще один момент, RewriteCond не требуется знак = (для дальнейшего использования):

RewriteCond %{SERVER_NAME} ^www.example.com$

Удалить DocumentRoot в VirtualHost *: 80

Поскольку вы никогда не отправляете на сервер какой-либо контент для *: 80 VirtualHost, вы должны удалить директивы DocumentRoot.


Проблема множественных SSL VirtualHosts

Для порта 80Нет проблем, вы можете иметь много виртуальных хостов.Apache будет искать запрашиваемый домен и использовать соответствующую конфигурацию.

Но для SSL это не работает.Apache не может прочитать запрашиваемый домен до после согласования сертификатов SSL с браузером.Так что же это делает?Он использует первый * 443 VirtualHost, который находит.

Обходные пути:

  • 1 домен SSL == 1 IP == 1 VirtualHost установлен только для этого IP(т.е. не *: 443).Проблема в том, что у вас может не быть доступа к нескольким адресам.

  • 1 домен SSL == 1 порт == 1 VirtualHost установлен для этого порта (т. Е. *: 443, *:444, ...).Проблема здесь заключается в том, что порт 443 используется по умолчанию для сайтов https, поэтому другие сайты необходимо явно запрашивать в браузере, что противоречит интуитивно понятным для клиентов.Если у вас есть сетевая инфраструктура перед вашим Apache, вы можете изменить порт там.https://www.example.com отправляется на apache:443, https://www.example2.com отправляется на apache:444 и так далее.Но это нужно сделать за до трафика до Apache.

  • Использовать SNI в Apache (https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI).


В вашем случае

  • Запрос http://<SOMEDOMAIN> на порт 80 отправляется на соответствующий VirtualHost.
  • Этот VH перенаправляет его на https://<SOMEDOMAIN>,на порту 443. Ну, это должно быть.
  • Первый VH всегда используется, поэтому сертификат /etc/letsencrypt/live/sidmandesign.com/fullchain.pem отправляется в браузер клиента. Вы можете проверить это, посмотрев на консоль браузера и проверив сертификат.
  • Таким образом, браузер видит сертификат для одного домена, который не соответствует запрошенному (кроме первого домена).

И наконец

Для "ERR_TOO_MANY_REDIRECTS in Chrome" посмотрите на консоль (F12, вкладка "Сеть", проверьте "Сохранить журналы"). Вы увидите все перенаправления, полученные Chrome. Таким образом, вы увидите, чтоЯ полагаю, что знак '=' все портит.

...