全局 Apache 别名,忽略虚拟主机

全局 Apache 别名,忽略虚拟主机

我有一个全球条目

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 的解决方法(根据文档,它在别名之前进行评估)。它需要一个额外的主机和一个全局配置文件:

  1. 创建一个仅服务于 acme 请求的附加(子)域/主机,比如说“acme.mydomain.tld”
  2. 创建(并启用)一个全局配置,将所有 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

相关内容