我在一个生产网站中使用Django 1.5.1,但是由于不允许主机请求,我有大量的500的报告。我的网站的Nginx vhost配置如下:
server {
listen 80;
server_name mywebsite.com.br;
location / {
uwsgi_pass unix:/opt/project/run/brmed_web.sock;
include uwsgi_params;
}
}
我已经将settings.py
上允许的主机设置设置为:
ALLOWED_HOSTS = ['mywebsite.com.br']
尽管它在我允许的主机上工作得很好,但对于陌生的主机,我总是收到以下错误:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 92, in get_response
response = middleware_method(request)
File "/usr/local/lib/python2.7/dist-packages/django/middleware/common.py", line 57, in process_request
host = request.get_host()
File "/usr/local/lib/python2.7/dist-packages/django/http/request.py", line 72, in get_host
"Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): %s" % host)
SuspiciousOperation: Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): 108.166.113.25
一些主机,如果不是全部,显然是恶意的,因为他们的请求试图欺骗一些PHP的东西。关于其中一个主机的更多细节可以在这个链接中找到。
我的问题是,我在Nginx配置上遗漏了什么,允许这些请求与这些奇怪的主机通过?我的Nginx只有这个配置文件和它的默认配置文件。
这取决于你的默认配置,但是从ServerFault上的这个答案,你必须在Nginx中定义一个默认的vhost,否则它将使用第一个作为默认值。
基本上,您的配置应该是这样的,以便只允许对"mywebsite.com.br"的请求通过:
server {
listen 80 default_server;
location / {
# or show another site
return 403 "Forbidden";
}
}
server {
listen 80;
server_name mywebsite.com.br;
location / {
uwsgi_pass unix:/opt/project/run/brmed_web.sock;
include uwsgi_params;
}
}
如果您还需要提供其他子域(www.mywebsite.com.br等),您可以将server_name设置为".mywebsite.com.br"。