Django未从nginx获取脚本名称头

Django未从nginx获取脚本名称头,django,nginx,Django,Nginx,顺便说一下,我正在使用Django 1.8 我试图在部署多个Django应用程序时使用相同的域/子域但不同的URL,因此我使用的是SCRIPT_NAME头 我的Nginx配置: location /myapp/ { proxy_pass http://127.0.0.1:8000/; proxy_set_header SCRIPT_NAME /myapp; } 站点正在加载此配置,但请求无效。META['SCRIPT_NAME']为空,当我悬停任何链接时,它们在URL中显示时没

顺便说一下,我正在使用Django 1.8

我试图在部署多个Django应用程序时使用相同的域/子域但不同的URL,因此我使用的是SCRIPT_NAME头

我的Nginx配置:

location /myapp/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header SCRIPT_NAME /myapp;
}
站点正在加载此配置,但请求无效。META['SCRIPT_NAME']为空,当我悬停任何链接时,它们在URL中显示时没有“myapp”


有什么帮助吗?

在以下代码片段的帮助下,我能够部分解决这个问题:

然后,我在myapp文件夹中创建了一个
wsgi.py
文件,其中包含:

from django.core.wsgi import get_wsgi_application

_application = get_wsgi_application()

def application(environ, start_response):
    script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
    if script_name:
        environ['SCRIPT_NAME'] = script_name
        path_info = environ['PATH_INFO']
        if path_info.startswith(script_name):
            environ['PATH_INFO'] = path_info[len(script_name):]

    scheme = environ.get('HTTP_X_SCHEME', '')
    if scheme:
        environ['wsgi.url_scheme'] = scheme
    return _application(environ, start_response)
我还不得不改用手机

python manage.py runserver 0.0.0.0:8000
用于使用
uWSGI
为应用程序提供服务。为此,我遵循了 但基本上可以归结为

pip install uwsgi
然后为Django应用程序提供

uwsgi --http :8000 --module myapp.wsgi

编辑:这目前不适用于
静态
媒体
资产。查看此公开票证:

我在所有搜索中都没有找到此问题的答案,因此它在这里:

  • 这仅在Django3.1.6中正确实现,因此1.8无法工作
  • proxy\u passhttp://127.0.0.1:8000/
    错误,您需要
    代理\u通行证http://127.0.0.1:8000
    (不带尾随反斜杠),以便将
    /myapp
    保持在URL路径的开头。Django希望它的请求以
    SCRIPT\u NAME
    头的值开始,并在应用程序看到它之前将其去掉。Django将为任何不以这种方式启动的URL返回一个错误
  • 如果您的
    settings.py
    STATIC\u URL
    定义为类似
    /STATIC/
    的绝对路径,Django将不会在它前面加上您的脚本名。使用相对路径,如
    static/
  • 如果中间有任何其他代理,请确保它们没有删除
    静态\u文件
    标题。例如,如果中间有另一个nginx,则需要确保
    服务器
    块中的
    行在上的\u头中加下划线
  • LOGIN\u REDIRECT\u URL
    这样的设置没有预先设置好(并且您不能使用相对路径技巧,因为这会产生一些不同的效果),因此您可以使用一行代码来伪造它:
    proxy\u REDIRECT//myapp/
    ,但大多数重定向都是预先设置好的,所以在此之前还需要一行:
    proxy_redirect/myapp//myapp/。当然,如果
    /myapp/myapp
    实际上是一条有效路径,那么这种技术就不起作用
  • 如果您想静态地提供静态文件,请记住为其包含一个位置块
  • 因此,您的nginx块应该有点像这样:

    location /myapp/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header SCRIPT_NAME /myapp;
        proxy_redirect /myapp/ /myapp/;
        proxy_redirect / /myapp/;
        location /myapp/static/ {
            root /var/www; # files are deployed to /var/www/myapp/static
        }
    }
    
    settings.py
    中:

    STATIC_URL=`static/`
    
    requirements.txt
    中:

    Django==3.1.6
    

    真是一场噩梦。有人有更好的想法吗?

    可能该值存储在
    request.META['HTTP\u SCRIPT\u NAME']
    对不起,出现错误HTTP\u SCRIPT\u NAME:keyrorr所以@user1305989的主要问题可能仍然是相同的,您可以将其表述为“manage.py runserver不尊重SCRIPT\u NAME头”。对我来说,这似乎是Django的一个错误
    Django==3.1.6