我有一个全球条目
Alias /.well-known/acme-challenge /var/www/letsencrypt/.well-known/acme-challenge/
在我的 apache 配置中,在任何虚拟主机之外。这样,上述别名对所有虚拟主机都有效。不幸的是,仍然有一些虚拟主机无法按预期工作,例如由于重定向、身份验证要求等。
有没有办法告诉 apache 在读取特定虚拟主机的配置之前考虑这个别名?
答案1
您可以尝试在所有虚拟主机之前添加此项:
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
#Bypass Auth
<Directory /var/www/letsencrypt/.well-known/acme-challenge/>
Satisfy any
</Directory>
#Redirect before other rewrite rules
RewriteCond %{REQUEST_URI} /\.well\-known/acme\-challenge/
RewriteRule (.*) /.well-known/acme-challenge/$1 [L,QSA]
答案2
我遇到了和你一样的问题,即 letsencrypt acme apache 别名问题。在阅读完 apache 文档后,我仍然不明白为什么全局别名不能按预期工作(根据文档,它应该可以)。
无论如何,这里有一个使用 RedirectMatch 的解决方法(根据文档,它在别名之前进行评估)。它需要一个额外的主机和一个全局配置文件:
- 创建一个仅服务于 acme 请求的附加(子)域/主机,比如说“acme.mydomain.tld”
创建(并启用)一个全局配置,将所有 acme 请求重定向到该主机,但将主机本身排除在重定向之外:
<If "%{HTTP_HOST} != 'acme.mydomain.tld'"> RedirectMatch "^/.well-known/(.*)$" "http://acme.mydomain.tld/.well-known/$1" </If>
这适用于所有使用旧别名方法存在问题的 VirtualHosts。
答案3
根据 Apache 2.4 文档,您有以下选择:
有两种基本类型的容器。大多数容器针对每个请求进行评估。所附指令仅适用于与容器匹配的请求。
<IfDefine>, <IfModule>, and <IfVersion>
另一方面,容器仅在服务器启动和重新启动时进行评估。如果启动时它们的条件为真,则所附指令将适用于所有请求。如果条件不为真,则所附指令将被忽略。
也许您可以尝试使用上面提到的容器之一,并添加所有请求所需的全局别名。详情请见此处:https://httpd.apache.org/docs/2.4/sections.html#mergin。
答案4
我用全局别名处理了这个问题
创建全局配置
别名 /.well-known/acme-challenge/ /my-acme-challenge-directory