我正在尝试滚动我自己的虚拟主机配置来处理 certbot/letsencrypt。我想将除请求之外的任何内容重定向到 /.well-known 到 HTTPS。但 .wellknown 的例外情况不起作用;对http://www.example.com/.well-known/的请求返回 301 重定向到 https。我已在下面的代码中对主机名进行了匿名化处理。
请注意,我在此处发布之前遇到了这篇文章/答案- 并且那里接受的答案描述了(我相信)我在下面尝试过的第一个配置 - 这让我认为这不是重复的。
<VirtualHost *:80>
DocumentRoot "/var/www/html"
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTPS} !=on
# RewriteRule ^(\.well-known) - [END]
RewriteCond %{REQUEST_URI} !^\.well-known
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
# additional auth config elsewhere, hence....
<Location /.well-known/ >
Require all granted
</Location>
</VirtualHost>
正如上面的注释行所示,我也尝试过:
RewriteRule ^(\.well-known) - [END]
# RewriteCond %{REQUEST_URI} !^\.well-known
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
路径上没有 .htaccess 文件,但为了确保这一点,我禁用了所有重写指令,并获得了 /.well-known/ 和其他请求的 HTTP 200 响应。我正在使用curl -I
301 的浏览器缓存进行测试,因此不需考虑。每次更改后,我都会完全重新启动 httpd,而不仅仅是重新加载。
这是 Centos 7 上的 httpd-tools-2.4.6-99。
如何覆盖默认重定向?
您缺少前导
/
,即您正在使用!^\.well-known
而不是!^/\.well-known
。最好也添加 tailing/
,以单独匹配该目录上的内容:!^/\.well-known/
。尽管如此,丹尼尔·费拉达尔(Daniel Ferradal)的答案中的例子是实现相同目标的更正确的方法。
另一方面,因为这是针对 Let's Encrypt 的HTTP-01 挑战,所以您根本不需要此条件:
我会尝试做得更简单。
加载 mod_alias 后(在您的示例中不需要 mod_rewrite,除非确实有必要,否则我倾向于不使用 mod_rewrite),并且还使用目录而不是位置作为真实目录路径,也不需要引用路径。
我相信一个更简单的例子可以满足你的要求: