Apache配置需求:代理整个站点且排除ACME挑战请求的实现方案咨询
Apache配置需求:代理整个站点且排除ACME挑战请求的实现方案咨询
嗨John,我太懂你被抠门托管服务商拿捏的无奈了——既要保住老婆能用的简易建站工具,又要免费搞定TLS,咱们用Apache绝对能把这事办妥!下面是亲测可行的配置方案:
首先得确保你的Apache开启了必备模块,要是Debian/Ubuntu系统,直接跑这几条命令:
a2enmod proxy proxy_http rewrite ssl systemctl restart apache2
如果是CentOS/RHEL系,得编辑httpd.conf或者conf.modules.d/下的配置文件,把对应模块的注释去掉,再重启httpd服务。
接下来是核心的VirtualHost配置,咱们分逻辑处理:优先拦截ACME挑战请求,代理其余所有请求到原托管站点,还要保证原站点的Host头不丢失(不然人家的虚拟主机不会响应你的请求):
完整Apache配置示例
# 处理80端口请求:强制HTTPS+ACME挑战支持 <VirtualHost *:80> ServerName www.example.com # 优先捕获ACME验证请求,直接返回本地服务器上的验证文件 RewriteEngine On RewriteRule ^/.well-known/acme-challenge/(.*)$ /var/www/acme-challenges/$1 [L] # 其他所有HTTP请求强制跳转到HTTPS Redirect permanent / https://www.example.com/ </VirtualHost> # 443端口HTTPS代理核心配置 <VirtualHost *:443> ServerName www.example.com # 同样保留ACME挑战处理(保险起见,避免验证走HTTPS路径出问题) RewriteEngine On RewriteRule ^/.well-known/acme-challenge/(.*)$ /var/www/acme-challenges/$1 [L] # 关键:保留原请求的Host头,让托管站点的虚拟主机能正确识别 ProxyPreserveHost On # 代理所有非ACME请求到原托管站点 ProxyPass / http://www.example.com/ ProxyPassReverse / http://www.example.com/ # TLS证书配置(用Let's Encrypt生成的证书路径) SSLEngine On SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem </VirtualHost>
几个必须注意的细节
- ACME目录权限:你得在本地服务器创建
/var/www/acme-challenges/目录,给Apache运行用户(比如www-data)设置可读权限,不然验证会直接失败。 - ProxyPreserveHost一定要开启:这个参数会把客户端请求的Host头(也就是www.example.com)原封不动传给托管站点,不然人家的虚拟主机只会返回默认站点,你的代理就白搭了。
- 测试验证:配置完重启Apache后,先用
curl http://www.example.com/.well-known/acme-challenge/你的验证文件名检查是否返回正确内容,再用curl https://www.example.com确认是否正常转发到原站点内容。
这样配置后,既解决了Let's Encrypt的证书验证问题,又能让所有用户请求通过你的Apache代理走HTTPS,原站点的内容和老婆的建站工具完全不受影响!
备注:内容来源于stack exchange,提问作者John Oliver
相关产品推荐
相关产品推荐

