【发布时间】:2020-12-21 13:11:17
【问题描述】:
我有几个运行 Django/Apache 的网站部署在 AWS ElasticBeanstalk 中。
我唯一的问题是我每天收到数百封关于这个主题的电子邮件:
[Django] ERROR (EXTERNAL IP): Invalid HTTP_HOST header: WHATEVER. You may need to add WHATEVER to ALLOWED_HOSTS.
那是因为我已经在我的 Django 配置中正确配置了 ALLOWED_HOSTS 变量,但我需要 Apache 阻止所有无效的 HTTP_HOST 标头,这样它们甚至不会到达 Django 并每天处理掉这数百封电子邮件。
我知道,这里和那里有很多关于如何在 Apache 中执行此操作的示例,但我还没有找到一个在 AWS ElasticBeanstalk 中部署时如何执行此操作的示例。
如果您不熟悉 AWS ElasticBeanstalk,请记住,该系统会自动创建一个 /etc/httpd/conf.d/wsgi.conf 文件,其中包含一些由 Amazon 进行的配置,并且 Amazon 可以(并且将)将来在我们的控制之外修改它们。
因此,当我们想向 Apache 添加一些配置时,例如提供重定向,首选方式是在我们的项目中提供一个 YAML 文件,该文件定义一个新的独立 Apache 配置文件,除了 @亚马逊自动创建的 987654326@ 文件,如下所示:
files:
"/etc/httpd/conf.d/ssl_rewrite.conf":
mode: "000644"
owner: root
group: root
content: |
RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
这样做,一旦我们部署了我们的代码,一个/etc/httpd/conf.d/ssl_rewrite.conf文件也将被Apache创建和使用(我们没有编辑原始的wsgi.conf文件,我们只是在一个新文件中提供了更多的配置)。
这里有对这种模式的惊人解释:https://stackoverflow.com/a/38751648/1062587。
这些 YAML 配置文件可以创建 Apache 配置文件或将某些内容附加到现有文件中,但不能进行替换或修改。
但是,关于我的问题,原始的wsgi.conf 文件已经提供了这样的部分:
<VirtualHost *:80>
[...]
<Directory /opt/python/current/app/>
Require all granted
</Directory>
[...]
</VirtualHost>
由于我想阻止所有无效的主机请求,我假设我需要将其更改为类似的内容(根据此答案:https://stackoverflow.com/a/43322857/1062587):
<VirtualHost *:80>
[...]
<Directory /opt/python/current/app/>
Require expr "%{HTTP_HOST} in {'whatever.com', 'www.whatever.com'}"
Options
</Directory>
[...]
</VirtualHost>
我的问题是:YAML 文件无法进行编辑。我只能为他们提供新的配置。
所以,我不知道我是否可以在独立的 Apache 配置文件中提供一些配置来覆盖现有的 <VirtualHost> -> <Directory> 部分,所以我可以像 ElasticBeanstalk 理解的那样在 YAML 文件中定义所需的代码。
否则,我将不得不提供一个脚本来即时进行替换。我知道该怎么做,但我觉得它很难看。我只是问是否有更优雅的解决方案。
【问题讨论】:
-
为什么不在 ebextension 中创建
VirtualHost,ServerName 为HTTP_HOST? -
我对 Apache 了解不多,但是,我不需要覆盖现有的
<VirtualHost *:80>指令以便阻止来自任何主机的所有内容吗?可以举个例子吗? -
通常情况下,您托管的每个域都有一个
VirtualHost条目,因此这不是阻塞的情况,但包括主机/服务器。看看这个问题; stackoverflow.com/questions/21878024/… -
请阅读我的问题。实际上,我首先在它的中间链接了同一个线程,我什至从那里复制/粘贴了一些代码。无论如何,所有线程都在谈论可以添加的配置,所以 YAML 文件是一个简单的解决方案。然而,在我的问题中,我需要编辑亚马逊创建的东西,所以它是完全不相关的,我的问题的重点在这里。
-
我在 AWS WAF 中使用自定义规则来解决这个确切的问题。
标签: django apache amazon-elastic-beanstalk