django - 使用 Nginx 避免 Django 因不允许的主机而出现 500 错误

标签 django nginx

我在生产网站中使用 Django 1.5.1,但由于不允许的主机请求,我收到了大量 500 的报告。我网站的 Nginx 虚拟主机配置如下:

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 东西来欺骗。有关其中一台主机的更多详细信息,请参阅 this link .

我的问题是,我在允许这些奇怪主机的请求通过的 Nginx 配置中缺少什么?仅供引用,我的 Nginx 只有这个配置文件及其默认配置文件。

最佳答案

这取决于您的默认配置,但来自 this answer on ServerFault您必须在 Nginx 中定义默认虚拟主机,否则它将使用第一个作为默认虚拟主机。

基本上,您的配置应如下所示,以便仅允许传递对“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”。

关于django - 使用 Nginx 避免 Django 因不允许的主机而出现 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17149435/

相关文章:

linux - valid_referers nginx http 和 https

nginx - 如何将 nginx 与 Go 一起用于子域?

python - DRF-Extension缓存忽略查询参数

php - 根目录更改后 Nginx 写入 "no input file specified"- CentOS 7

python - 我的登录表单出现 "bound method"错误

python - 在 Django 中创建一个智能类工厂

nginx - 如何使用 php-fpm 和 nginx 设置特定 IP 地址的内存限制和执行超时?

php - index.php 作为 laravel 网站 url 中的参数

ajax - 我的 Ajax 请求在 django 中抛出错误,我如何找到它是什么?

python - django 管理,使用自定义 View 扩展管理