Вопрос или проблема
У меня есть глобальный алиас
Alias /.well-known/acme-challenge /var/www/letsencrypt/.well-known/acme-challenge/
в моей конфигурации Apache, вне каких-либо виртуальных хостов. Таким образом, указанный выше алиас работает для всех виртуальных хостов. К сожалению, есть виртуальные хосты, где это не работает должным образом, например, из-за перенаправлений, требований к аутентификации и т. д.
Есть ли способ сказать Apache учитывать этот алиас, даже не читая конфигурацию конкретного виртуального хоста?
Вы можете попробовать добавить это перед всеми вашими виртуальными хостами:
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
#Обойти аутентификацию
<Directory /var/www/letsencrypt/.well-known/acme-challenge/>
Satisfy any
</Directory>
#Перенаправить перед другими правилами перезаписи
RewriteCond %{REQUEST_URI} /\.well\-known/acme\-challenge/
RewriteRule (.*) /.well-known/acme-challenge/$1 [L,QSA]
Я столкнулся с вашим вопросом о той же проблеме алиаса letsencrypt acme в Apache. После прочтения документации Apache я все еще не понимаю, почему глобальный алиас не работает как ожидалось (согласно документации, он должен).
В любом случае, вот обходной путь, который использует RedirectMatch (который, согласно документации, оценивается раньше алиаса). Это требует одного дополнительного хоста и одного глобального конфигурационного файла:
- Создайте дополнительный (суб)домен / хост, который обслуживает только запросы acme, скажем, “acme.mydomain.tld”
-
Создайте (и включите) глобальную конфигурацию, которая перенаправляет все запросы acme на этот хост, исключая сам хост из перенаправления:
<If "%{HTTP_HOST} != 'acme.mydomain.tld'"> RedirectMatch "^/.well-known/(.*)$" "http://acme.mydomain.tld/.well-known/$1" </If>
Это работает для всех моих виртуальных хостов, которые имели проблемы со старым подходом алиасов.
Согласно документации Apache 2.4 у вас есть следующие опции:
Существуют два основных типа контейнеров. Большинство контейнеров оцениваются
для каждого запроса. Вложенные директивы применяются только к тем
запросам, которые соответствуют контейнерам. Контейнеры<IfDefine>, <IfModule> и <IfVersion>
оцениваются только при
запуске и перезапуске сервера. Если их условия истинны при запуске,
то вложенные директивы будут применяться ко всем запросам. Если
условия не истинны, вложенные директивы будут проигнорированы.
Может быть, попробуйте использовать один из упомянутых выше контейнеров и добавить алиас, который вам нужен для всех запросов. Подробности здесь: https://httpd.apache.org/docs/2.4/sections.html#mergin.
Я использую глобальный /etc/httpd/conf.d/acme.conf:
<IfModule mod_proxy.c>
ProxyPass /.well-known/acme-challenge !
</IfModule>
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
<Directory "/var/www/letsencrypt/.well-known/acme-challenge/">
Options None
AllowOverride None
ForceType text/plain
</Directory>
НО если вы используете директиву <Location> в виртуальных хостах, это не работает, поэтому вы должны добавить НИЖЕ:
<Location /.well-known/acme-challenge>
ProxyPass !
</Location>
Я решил проблему с глобальным алиасом
Создайте глобальную конфигурацию
Alias /.well-known/acme-challenge/ /my-acme-challenge-directory
Ответ или решение
Для решения проблемы с глобальным использованием директивы Alias
в Apache, особенно в контексте выполнения проверок Let’s Encrypt, можно рассмотреть несколько подходов. Известно, что настройки Apache обрабатываются в порядке их объявления, и некоторые директивы в виртуальных хостах могут предшествовать глобальным настройкам. Вот некоторые возможные решения для обеспечения корректной работы Alias
для всех виртуальных хостов.
Шаги по настройке глобального Alias для acme-challenge
-
Создание глобального Alias:
Убедитесь, что в вашем основном конфигурационном файле Apache (например,/etc/httpd/conf/httpd.conf
или/etc/apache2/apache2.conf
) присутствует следующее:Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/ <Directory "/var/www/letsencrypt/.well-known/acme-challenge/"> Options None AllowOverride None Require all granted </Directory>
Это создаст алиас для всех запросов, направленных на
/.well-known/acme-challenge/
. -
Обработка аутентификации:
Если ваши виртуальные хосты требуют аутентификации или имеются переадресации, вам придется указать, что для данного каталога разрешено любую аутентификацию. В этом случае вы можете использовать директивуSatisfy
:<Directory "/var/www/letsencrypt/.well-known/acme-challenge/"> Satisfy any Allow from all </Directory>
-
Использование
RewriteRule
:
Если вышеописанные решения не помогли, вы можете использоватьRewriteRule
для перенаправления запросов. Вставьте следующее перед определениями виртуальных хостов:RewriteEngine On RewriteCond %{REQUEST_URI} ^/.well-known/acme-challenge/ RewriteRule ^(.*)$ /var/www/letsencrypt/.well-known/acme-challenge/$1 [L,QSA]
-
Создание отдельного домена для acme:
В случаях, когдаAlias
не работает из-за прокси или других конфигурационных особенностей, рассмотрите возможность создания отдельного поддомена, напримерacme.mydomain.tld
, который будет обрабатывать только запросы на/.well-known/acme-challenge/
. Настройте глобальный редирект:<If "%{HTTP_HOST} != 'acme.mydomain.tld'"> RedirectMatch "^/.well-known/(.*)$" "http://acme.mydomain.tld/.well-known/$1" </If>
-
Использование директивы
ProxyPass
:
Для более сложных случаев может понадобиться директиваProxyPass
. Убедитесь, что проксирование не мешает работе:<IfModule mod_proxy.c> ProxyPass /.well-known/acme-challenge ! </IfModule>
-
Обработка директивы
<Location>
в виртуальных хостах:
Если внутри ваших виртуальных хостов используется директива<Location>
, то вы также должны указать, чтобы эта директива не мешала глобальному алиасу:<Location /.well-known/acme-challenge> ProxyPass ! </Location>
Заключение
Следуя приведенным выше шагам, вы сможете настроить глобальный Alias
для обработки запросов от Let’s Encrypt, который будет корректно работать вне зависимости от конфигураций виртуальных хостов. Не забудьте перезапустить Apache после внесения изменений:
sudo systemctl restart apache2 # или sudo systemctl restart httpd
Эти подходы помогут вам обеспечить безошибочное получение сертификатов, не вмешиваясь в установленные вами настройки виртуальных хостов.