Django未从nginx获取脚本名称头
顺便说一下,我正在使用Django 1.8 我试图在部署多个Django应用程序时使用相同的域/子域但不同的URL,因此我使用的是SCRIPT_NAME头 我的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中显示时没
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
编辑:这目前不适用于
静态
和媒体
资产。查看此公开票证:我在所有搜索中都没有找到此问题的答案,因此它在这里:
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
实际上是一条有效路径,那么这种技术就不起作用
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