![我在 apache httpd conf 文件中进行了重写,这会破坏 certbot。有没有办法更改它,让它不受影响?](https://linux22.com/image/759449/%E6%88%91%E5%9C%A8%20apache%20httpd%20conf%20%E6%96%87%E4%BB%B6%E4%B8%AD%E8%BF%9B%E8%A1%8C%E4%BA%86%E9%87%8D%E5%86%99%EF%BC%8C%E8%BF%99%E4%BC%9A%E7%A0%B4%E5%9D%8F%20certbot%E3%80%82%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E6%9B%B4%E6%94%B9%E5%AE%83%EF%BC%8C%E8%AE%A9%E5%AE%83%E4%B8%8D%E5%8F%97%E5%BD%B1%E5%93%8D%EF%BC%9F.png)
我在 Apache httpd 中设置了一个子域,它是 Tomcat 服务器的前端,其中 httpd 服务器由 Let's Encrypt 保护。
如果我在 conf 文件中激活以下重写,那么 certbot 将失败。
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
如果我将其注释掉,那么 certbot 就可以工作。
我不太确定,但我认为 100% 一致。当然,使用挑战缓存,在成功续订后整整一个月内我无法获得另一个有意义的测试结果。
答案1
如果我理解正确的话,您希望将所有非 HTTPS 请求重定向到 HTTPS。所以我猜您的重写是在容器中<VirtualHost *:80>
,用于非 HTTPS 站点。
现在您想添加另一个条件,不重定向 Lets Encrypt 挑战。我认为您可能正在使用HTTP-01 挑战,这意味着您不想将请求重定向到http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>
。那么下面的方法有效吗?
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,QSA]
答案2
另一种方法是,它将重定向 http->https 除 /.well-known 之外的所有内容:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/\.well-known/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}