Apache反向代理配置排除/.well-known目录以支持Let's Encrypt证书验证的问题
Apache反向代理配置排除/.well-known目录以支持Let's Encrypt证书验证的问题
你猜的完全没错!问题的核心就是你的反向代理规则把所有请求都转发到了Mattermost,包括Let's Encrypt验证需要的/.well-known目录请求。而你之前加的ProxyPass /.well-known/ !没生效,是因为<Location />块的优先级比单独的ProxyPass指令更高,后面的代理规则直接覆盖了前面的排除规则。
下面给你两种可行的解决方案,选一种适合你的就行:
方案一:在块内添加排除规则
既然你用了<Location />来统一配置代理,那可以直接在这个块里先声明排除规则,让Apache优先处理/.well-known的请求:
ServerAdmin my.address@mydomain.com ProxyPreserveHost On RewriteEngine On # WebSocket的代理规则保持不变 RewriteCond %{REQUEST_URI} /api/v[0-9]+/(users/)?websocket [NC] RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR] RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC] RewriteRule .* ws://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L] <Location "/"> Require all granted # 关键:先排除/.well-known目录的代理请求 ProxyPass "/.well-known" ! # 其余请求正常代理到Mattermost ProxyPass http://127.0.0.1:8065/ ProxyPassReverse http://127.0.0.1:8065/ ProxyPassReverseCookieDomain 127.0.0.1 mattermost.mydomain.com </Location>
原理是在<Location>块内,ProxyPass的否定规则会优先匹配,所以/.well-known下的请求会直接由Apache本地处理,不会转发到Mattermost,Let's Encrypt就能顺利完成验证了。
方案二:移除块,用RewriteRule全局排除
如果你不想用<Location>块,也可以通过Rewrite规则先拦截/.well-known的请求,再处理代理:
ServerAdmin my.address@mydomain.com ProxyPreserveHost On RewriteEngine On # 优先排除/.well-known目录,直接由Apache本地处理 RewriteRule ^/.well-known/ - [L] # WebSocket代理规则保持不变 RewriteCond %{REQUEST_URI} /api/v[0-9]+/(users/)?websocket [NC] RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR] RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC] RewriteRule .* ws://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L] # 其余所有请求代理到Mattermost ProxyPass / http://127.0.0.1:8065/ ProxyPassReverse / http://127.0.0.1:8065/ ProxyPassReverseCookieDomain 127.0.0.1 mattermost.mydomain.com
这种方式更简洁,通过RewriteRule ^/.well-known/ - [L]让Apache直接跳过代理流程,处理该目录的请求。
最后要做的几件事:
- 修改完配置后,重启Apache服务生效:
sudo systemctl restart apache2 - 手动测试一下访问
https://mattermost.mydomain.com/.well-known/acme-challenge/测试文件名,确认能正常返回内容(如果ISPConfig已经自动生成了验证文件的话)。 - 重新触发ISPConfig的Let's Encrypt证书申请,或者手动运行证书获取命令。
备注:内容来源于stack exchange,提问作者TomS
相关产品推荐
相关产品推荐

