gpt4 book ai didi

Django 不从 nginx 获取脚本名称 header

转载 作者:行者123 更新时间:2023-12-03 07:06:26 27 4
gpt4 key购买 nike

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

我正在尝试使用相同的域/子域但不同的 URL 部署多个 Django 应用程序,因此我使用 SCRIPT_NAME header 。

我的 Nginx 配置:

location /myapp/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header SCRIPT_NAME /myapp;
}

站点正在加载此配置,但请求。 META['SCRIPT_NAME'] 为空,当我将鼠标悬停在任何链接上时,它们显示的 URL 中没有“myapp”。

有什么帮助吗?

最佳答案

我在所有搜索中都没有找到这个问题的答案,所以这里是:

  1. 这仅在 Django 3.1.6 中正确实现,因此 1.8 不起作用。
  2. proxy_pass http://127.0.0.1:8000/ 是错误的,您需要 proxy_pass http://127.0.0.1:8000 (不带结尾的反斜杠)为了将 /myapp 保留在 URL 路径的开头。 Django 希望其请求以 SCRIPT_NAME header 的值开头,并在您的应用程序看到它之前将其删除。对于任何不是这样开头的 URL,Django 都会返回错误。
  3. 如果您的 settings.pySTATIC_URL 定义为绝对路径,例如 /static/,Django 不会在其前面添加您的脚本名称。使用相对路径,如 static/
  4. 如果中间有任何其他代理,请确保它们不会删除 STATIC_FILES header 。例如,如果您之间有另一个 nginx,那么您需要确保您的 server block 包含行 underscores_in_headers on;
  5. LOGIN_REDIRECT_URL 这样的设置不会被预先设置(并且你不能使用相对路径技巧,因为这会产生不同的效果),因此你可以用一行来伪造它: proxy_redirect//myapp/; ,但大多数重定向都是前置的,因此您还需要在其之前添加一行:proxy_redirect/myapp//myapp/;。当然,如果 /myapp/myapp 实际上是有效路径,则此技术将不起作用。
  6. 如果您想静态提供静态文件,请记住为此添加一个位置 block 。

所以你的 nginx block 应该看起来有点像这样:

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

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

关于Django 不从 nginx 获取脚本名称 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com