В нормальных условиях установка обратного прокси-сервера apache с исключением letsencrypt для /.well-known легко выполняется с помощью ProxyPass /.well-known! Кажется, стало намного сложнее (что-то, что я легко решил в nginx) настроить это исключение вместе с ограничениями ip для бэкэнда:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
Redirect / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/bfp-all_error.log
CustomLog ${APACHE_LOG_DIR}/bfp-all_access.log combined
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://localhost:8050/$1 [P,L]
ProxyRequests Off
ProxyPreserveHost On
<Location />
ProxyPass "http://localhost:8050/"
ProxyPassReverse "http://localhost:8050/"
Require ip 10.0.0.0/24
Require ip 192.168.0.0/24
</Location>
</VirtualHost>
Я пробовал использовать псевдоним и (а также каталог, который, кажется, уже довольно избыточен) перед разделом, но запросы продолжают поступать на бэкэнд:
DocumentRoot /var/web/letsencrypt
Alias /.well-known /var/web/letsencrypt/.well-known
<Directory /var/web/letsencrypt/.well-known>
Options -Indexes
Require all granted
</Directory>
<Location /.well-known>
ProxyPass !
Require all granted
</Location>
Есть идеи, как я могу это решить? Я ожидал, что это проблема, с которой люди сталкиваются время от времени, но я не нашел ничего в Интернете.
В этом случае «причина» пропуска запроса на бэкэнд заключается в том, что RewriteRule с [P] обходит блок Location с помощью директив ProxyPass (и любой возможный блок местоположения в пределах его соответствия). Таким образом, и они, и правила Require в нем будут проигнорированы, и запросы будут проксироваться для всех IP-адресов.
Если вы оставите RewriteRule и поставите ws://localhost:8050/
в правилах ProxyPass в <Location>
раздел, он будет работать как задумано. Наиболее конкретный блок Location выиграет при объединении конфигураций, где это касается настройки Require и ProxyPass. Если более неопределенный блок Location установил Require или ProxyPass, вы жестяная банка замените это новым в наиболее конкретном блоке Location.
Сам прокси-сервер websocket уже блокирует запросы без заголовков обновления.
Начиная с Apache 2.4.19, можно поместить хорошо известный псевдоним прямо в блок Location, опуская первый аргумент.