![如何让 apache 处理 .well-known/acme-challenge 并且仍然将 / 传递给 wsgi](https://linux22.com/image/745444/%E5%A6%82%E4%BD%95%E8%AE%A9%20apache%20%E5%A4%84%E7%90%86%20.well-known%2Facme-challenge%20%E5%B9%B6%E4%B8%94%E4%BB%8D%E7%84%B6%E5%B0%86%20%2F%20%E4%BC%A0%E9%80%92%E7%BB%99%20wsgi.png)
为了支持自动 LetsEncrypt 证书更新,certbot 使用--阿帕奇處理程序。
例如
certbot renew --apache
此处理程序安装一个临时 VirtualHost 用于*/.well-known/acme-挑战/在 Apache 服务器上验证续订。
问题是,如果现有的虚拟服务器使用 HTTPS 并且 Django 通过安装在 http 服务器根目录上的 WSGI 运行,则此机制不起作用。
临时 VirtualHost 无法捕获 URL,因此 Django 尝试为请求提供服务(并失败),因为该 URL 不在其 URL 列表中。
答案1
写这个问题让我思考它是如何工作的,所以我找到了答案。由于我找不到这个常见问题的答案,所以我想发布我找到的内容。
还有其他解决方案,例如certbot-django和django-letsencrypt但两者都比让股票 certbot 来处理要麻烦得多。
这--阿帕奇certbot 处理程序将其文件放置在/var/lib/letsencrypt/http_challenges,因此所需要做的就是让 Apache 按照文档对静态文件推荐的方式处理这些文件。
<VirtualHost *:443>
[....SSL stuff]
AliasMatch /.well-known/acme-challenge/(.*)$ /var/lib/letsencrypt/http_challenges/$1
<directory /var/lib/letsencrypt/http_challenges>
AllowOverride None
Require all granted
</directory>
[....WSGI stuff]
WSGIScriptAlias / /opt/myserver/myapp/wsgi.py
</VirtualHost>