- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个运行 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 header ,这样它们甚至无法到达 Django 并每天摆脱这数百封电子邮件。
/etc/httpd/conf.d/wsgi.conf
文件中包含由亚马逊制作的一些配置,亚马逊可以(并且将)在我们无法控制的 future 修改它们。
wsgi.conf
之外,该文件将被考虑在内。亚马逊自动创建的文件,如下所示:
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
文件,我们只是在新文件中提供更多配置)。
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 文件无法制作版本。我只能为它们提供新的配置。
<VirtualHost> -> <Directory>
部分,所以我可以像 ElasticBeanstalk 理解的那样在 YAML 文件中定义所需的代码。
最佳答案
由于我没有找到使用 YAML 文件的任何更好的方法,我使用 Python 脚本来修改原始 Apache wsgi.conf
以我能想到的最不可知的方式提交文件(无论亚马逊将来是否修改它)。
我在这里分享它,以防任何人发现它有用。使用这种方法,您不必在代码中的任何位置对主机白名单进行硬编码。
.ebextensions/deploy.config
中添加一个新命令container_commands:
01__apache_block_invalid_hosts:
command: python .ebextensions/apache_block_invalid_hosts.py
请注意,您可以考虑添加
leader_only: true
如果您不打算更改
DJANGO_ALLOWED_HOSTS
任何时候的环境变量(稍后解释)并且如果您了解其含义。
.ebextensions/apache_block_invalid_hosts.py
中创建 python 脚本from enum import Enum, auto
import os
NEW_AUTH_DIRECTIVE = """
Require expr "%{{HTTP_HOST}} in {{{hosts}}}"
Options
"""
class Step(Enum):
BEFORE_AUTH = auto()
INSIDE_AUTH = auto()
AFTER_AUTH = auto()
step = Step.BEFORE_AUTH
with open('/etc/httpd/conf.d/wsgi.conf', 'r') as file_in, open('../wsgi.conf', 'w') as file_out:
for line in file_in.readlines():
if step == Step.BEFORE_AUTH:
file_out.write(line)
if "<Directory /opt/python/current/app/>" in line:
hosts = ", ".join([f"'{i}'" for i in os.environ['DJANGO_ALLOWED_HOSTS'].split('__')])
file_out.write(NEW_AUTH_DIRECTIVE.format(hosts=hosts))
step = Step.INSIDE_AUTH
elif step == Step.INSIDE_AUTH:
if "</Directory>" in line:
file_out.write(line)
step = Step.AFTER_AUTH
elif step == Step.AFTER_AUTH:
file_out.write(line)
注意编辑文件的输出路径是
../wsgi.conf
而不是
/etc/httpd/conf.d/wsgi.conf
.相信我,它有效。
DJANGO_ALLOWED_HOSTS whatever.com__www.whatever.com__whatever.us-east-1.elasticbeanstalk.com
请注意,我使用的是
__
分隔符,而不是逗号。这是因为我有时会使用
eb clone
直接从我的命令行创建/克隆环境。同时提供环境变量值的更改。如果这样做,则不能在值中包含逗号,并且无法转义它们。
django-environ
库从系统读取环境变量):import environ
env = environ.Env()
env.read_env()
ALLOWED_HOSTS = env('DJANGO_ALLOWED_HOSTS', default='*').split('__')
关于django - 在 AWS ElasticBeanstalk 中阻止 Apache 中无效的 HTTP_HOST header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63704288/
在最近的 php 版本更新后,我突然收到来自 php 的通知。它用于多个地方(特别是我的 htmlMimeMail 类)。 代码是:$mail->setSMTPParams('*mail.xxxx.x
服务器变量 HTTP_HOST 是否总是为所有服务器定义,或者例如在 IIS 中用其他名称定义,甚至根本没有定义? 另外,那个值总是被定义的?或者一些主机他们没有定义那个值?还有其他方法可以检索该值吗
我已经编写了一个 PHP 脚本,我想在同一台服务器上的多个域上使用它(指向同一脚本)。我想为脚本添加功能,以便我可以随时找出脚本正在使用的域。 HTTP_HOST 可用于查找域,但是,我读到它不可靠,
我必须显示当前服务器主机(在 PHP 中,但这不是很重要)。我不知道我在哪个主机上。如果没有安全问题,我该怎么做?如果我使用 $_SERVER['HTTP_HOST'],它来自客户端,所以我不能相信这
从我们的本地主机开发环境部署到我们的暂存服务器后,我们在我们的站点中发现了错误。我们将错误缩小到以下 PHP 代码片段: $_SERVER['HTTP_HOST'] 我们用它来构建我们网站使
我进入错误日志: PHP Notice: Undefined index: HTTP_HOST in /var/www/html/web/libraries/src/Application/WebAp
我无法让它在 .htaccess 的这一部分工作,IfDefine从不运行。我做错了什么,setenvif模式已启用。 RewriteBase / SetEnvIf HTTP_HOST ^localh
我已经将我的站点 test.com 的域名更改为 test2.com 域名由test.com变更为test2.com I want to know if all the pages like test
我的 php 页面有很多流量,但没有设置变量 $_SERVER['HTTP_HOST']。 此流量相当于每秒 1 次点击。我不知道它可能是什么,但为了减少服务器负载,我在每个 php 页面的顶部这样做
我有一个充满网站 url 的数据库,主键是网站的 $_SERVER["HTTP_HOST"]。 当用户导航到 ... 让我们说 www.my-epic-example-url.com 时,它将连接数据
当我检查日志时,在极少数情况下,某些访问者(我认为是机器人)返回 $_SERVER['HTTP_HOST']:www.domain.co.uk:80 只有域名没有任何端口的正确方法是什么? 我应该这样
我不知道这可能是一个错误。 我的服务器上有 2 个虚拟主机。 virtualhost1.comvirtualhost2.com 如果我使用端口 80 (virtualhost1.com:80) 打开
我正在尝试使用 Django 框架开发一个网站并使用 DigitalOcean.com 启动并将必要的文件部署到 django-project 中。 我必须在 Django-project 中包含静态
相关资料: 查看所有的Server Variables ServerVariables集合检索预定的环境变量意义 今天突然想起每次请求 HTTP_HOST 和 SERVER_NAME 的值总是一
我们的本地开发设置需要 DMZ 中的一个框,每个开发人员在其 apache 配置中都有一行用于代理。看起来像: ProxyPreserveHost on ProxyPass /user1/ {user
我一直在读,在可能的情况下,我不应该使用 mod_rewrite .因此,我正在尝试使用 RedirectMatch 进行 http 到 https 重写。 问题:我如何使用 RedirectMatc
我有两台服务器正在为我的应用程序运行。 生产和分期如下。 如果 HTTP_HOST 匹配 www.sitedomain.com,我需要执行一些重定向规则或 stage.sitedomain.com 如
我的软件支持指向完全相同目录的多个域,我使用共享主机。我需要从具有各自主机名的目录中加载每个域的图标。这是一个视觉... http://www.example1.com/favicon.ico pub
这是我的.htaccess文件: RewriteEngine On '"> RewriteRule ^$ [R=301,L] RewriteRule ^$ [R=301,L]
这是我的.htaccess文件: RewriteEngine On '"> RewriteRule ^$ [R=301,L] RewriteRule ^$ [R=301,L]
我是一名优秀的程序员,十分优秀!