Назад | Перейти на главную страницу

Глобальный псевдоним Apache, игнорирование виртуальных хостов

У меня глобальная запись

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/

#Bypass Auth
<Directory /var/www/letsencrypt/.well-known/acme-challenge/>
Satisfy any
</Directory>

#Redirect before other rewrite rules
RewriteCond %{REQUEST_URI} /\.well\-known/acme\-challenge/
RewriteRule (.*) /.well-known/acme-challenge/$1 [L,QSA]

Я столкнулся с вашим вопросом с той же проблемой псевдонима letsencrypt acme apache. Прочитав документацию по apache, я до сих пор не понимаю, почему глобальный псевдоним не работает должным образом (согласно документации, которая должна).

В любом случае, вот обходной путь, который использует RedirectMatch (который, согласно документации, оценивается перед псевдонимом). Требуется один дополнительный хост и один глобальный файл конфигурации:

  1. Создайте дополнительный (под) домен / хост, который обслуживает только запросы acme, скажем, acme.mydomain.tld.
  2. Создайте (и включите) глобальную конфигурацию, которая перенаправляет все acme-запросы на этот хост, исключая сам хост из перенаправления:

    <If "%{HTTP_HOST} != 'acme.mydomain.tld'">
        RedirectMatch "^/.well-known/(.*)$" "http://acme.mydomain.tld/.well-known/$1" 
    </If>
    

Это работает для всех моих VirtualHosts, у которых были проблемы со старым псевдонимом.

Согласно документации Apache 2.4 у вас есть следующие варианты:

Есть два основных типа контейнеров. Большинство контейнеров оцениваются для каждого запроса. Прилагаемые директивы применяются только для тех запросов, которые соответствуют контейнерам. В <IfDefine>, <IfModule>, and <IfVersion> контейнеры, с другой стороны, оцениваются только при запуске и перезапуске сервера. Если их условия верны при запуске, то прилагаемые директивы будут применяться ко всем запросам. Если условия не верны, вложенные директивы будут проигнорированы.

Может быть, вы можете попробовать использовать один из контейнеров, упомянутых выше, и добавить псевдоним, который вам нужен глобально для всех запросов. Подробности здесь: https://httpd.apache.org/docs/2.4/sections.html#mergin.