自从django 1.4.4中引入ALLOWED_HOSTS设置以来,我收到了很多关于django错误的电子邮件到我的管理员地址,因为一些愚蠢的蜘蛛寻找易受攻击的phpMyAdmin安装或其他一些例外。这些邮件是完全有效的,因为蜘蛛请求中的主机头确实是错误的,但我宁愿让django在重要的事情出错时只向我发送错误邮件。是否有一种简单的方法可以使SuspiciousOperation
邮件静音,或者我是否必须一直进行CommonMiddleware
的子类化?
答案 0 :(得分:29)
为了完整性,您可以覆盖部分日志记录:(在django 1.6上测试):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
},
'loggers': {
'django.security.DisallowedHost': {
'handlers': ['null'],
'propagate': False,
},
},
}
答案 1 :(得分:6)
要取消管理员电子邮件,请定义日志记录过滤器:
def skip_suspicious_operations(record):
if record.name == 'django.security.DisallowedHost':
return False
return True
然后在settings.py中将其作为过滤器添加到LOGGING字典中:
'filters': {
'skip_suspicious_operations': {
'()': 'django.utils.log.CallbackFilter',
'callback': skip_suspicious_operations,
}
}
并将过滤器添加到mail_admins处理程序:
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['skip_suspicious_operations'],
'include_html' : True,
}
}
这适用于Django 1.6。在Django-1.5中,我认为与record.name进行比较的RHS有点不同,但除此之外它应该有效。
答案 2 :(得分:3)
如果你正在使用apache,你可以从httpd.conf过滤掉到不同主机的流量 - 这是一个比编写任何代码简单得多的解决方案。像
这样的东西WSGIPythonPath [your Python path]
ServerSignature Off
ServerTokens Prod
<VirtualHost *:80>
DocumentRoot /var/www
</VirtualHost>
<VirtualHost *:80>
ServerName www.myrealhost.com
rest of apache configuration ....
</VirtualHost>
第一个设置将获取与您的服务器名称不匹配的所有内容(例如www.myrealhost.com)
答案 3 :(得分:1)
有点谷歌搜索会发现Django的bug追踪器中已经存在一个错误:
https://code.djangoproject.com/ticket/19866
直到(希望)Django 1.5.1中有一个修复,有一个workaround涉及一个日志过滤器。
答案 4 :(得分:0)
但是等等,有一个应用程序!
答案 5 :(得分:0)
所以我通常更喜欢将所有不匹配的虚拟主机重定向到单个虚拟主机。这是通过添加apache.conf文件...
完成的<VirtualHost *:80>
RedirectMatch ^/?(.*) http://www.example.com/$1
</VirtualHost>
上面的示例将导致请求任何不匹配的vhost重定向到http://www.example.com,同时保留路径组件。
这还有一个额外的好处,就是纠正用户跟踪无效请求或某些此类事情的情况。