首页 > 解决方案 > 找不到静态文件(gunicorn)

问题描述

我知道这个问题已经被经常问到了。但是假设的解决方案似乎对我没有帮助。

这是我对静态文件的 Nginx 定义

    location /static/ {
        alias /data/atsi_webapp/ATSi_WebApp/static;
    }

这是我的 Django 设置

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

我已经跑了

python manage.py collectstatic

但是,我得到

未找到:/static/js/xxxx.js

标签: pythondjangonginxwebservergunicorn

解决方案


与错误使用aliasnginx 指令相关的此错误在 SO 上一遍又一遍地讨论。假设您有一个请求http://example.com/static/js/script.jslocation /static/ { ... }由 nginx指令处理的此请求的规范化 URI是/static/js/script.js 当您在该位置有alias /data/atsi_webapp/ATSi_WebApp/static;指令时,nginx 从 URI 中删除指令中/static/使用的前缀location,并将其余部分附加到asias指令中给出的路径。这个结果是/data/atsi_webapp/ATSi_WebApp/staticjs/script.js字符串的连接,它给你错误的/data/atsi_webapp/ATSi_WebApp/staticjs/script.js文件路径/名称。因此,在使用指令时编写路径的一般规则是,当alias指令中有斜杠时,在路径中使用尾部斜杠,location否则不要使用它。这意味着当您使用alias您应该使用的指令

location /static {
    alias /data/atsi_webapp/ATSi_WebApp/static;
}

或者

location /static/ {
    alias /data/atsi_webapp/ATSi_WebApp/static/;
}

静态文件的位置块(我认为第二个是首选)。

另一方面,root指令将其路径附加到完整的请求 URI。正如 nginx 文档所述

当 location 与指令值的最后一部分匹配时:

location /images/ {
    alias /data/w3/images/;
}

最好使用该root指令:

location /images/ {
    root /data/w3;
}

所以@Sabil的答案是正确的(虽然它缺少解释),你最好使用

location /static/ {
    root /data/atsi_webapp/ATSi_WebApp;
}

给定正确的文件名/路径,对于http://example.com/static/js/script.js请求的这种方式,路径/data/atsi_webapp/ATSi_WebApp将与规范化的 URI 连接。由于每个规范化的 URI 都以斜杠开头,因此您不需要将该斜杠添加到指令参数的末尾,尽管添加它不会像在指令参数末尾缺少必需的斜杠那样造成如此多的危害。/static/js/script.js/data/atsi_webapp/ATSi_WebApp/static/js/script.jsrootalias


推荐阅读