使用Gunicorn,Nginx和Django的URLparsing错误

我只有在使用Gunicorn时才会出现一个奇怪的错误:

我有一个设置Nginx的+ Django项目与以下configuration:

location / { proxy_pass http://127.0.0.1:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header SCRIPT_NAME /; } 

当我使用django开发服务器(1.7.5)时,使用:

 ./manage.py runserver 127.0.0.1:8080 

一切工作正常。

但是当我跑步

 gunicorn -b :8080 --forwarded-allow-ips="*" --proxy-allow-from="*" app.wsgi 

我只收到404错误(Django接收请求,因为我有debugging信息)。

这些错误是很奇怪的,因为variablesurlpatterns ( https://github.com/django/django/blob/1.7.5/django/views/debug.py#L1102 )没有设置。 我只获取原因variables( https://github.com/django/django/blob/1.7.5/django/views/debug.py#L1119 )设置为:

 {u'path': u'x/'} 

正如我所要求的http://domain.something.com/x/

最让人困扰的是django自带的基本服务器工作正常… 🙁

删除

  proxy_set_header SCRIPT_NAME /; 

从nginx配置将做的工作。 django是如何处理SCRIPT_NAME头部的:当存在的时候,django会在解析它的时候从URL的前面切掉这个值,并且在反转的时候将它加回到url的前面。 这样,你可以告诉Django所有的URL都应该是相对于某个目录,而不需要触摸项目中的任何东西。 SCRIPT_NAME应该设置为不包含/你的域的根目录的正确值是一个空字符串(或完全没有SCRIPT_NAME )。