在 nginx 中获取静态文件失败,出现 404

Posted

技术标签:

【中文标题】在 nginx 中获取静态文件失败,出现 404【英文标题】:Fetching static files failed with 404 in nginx 【发布时间】:2014-12-01 23:51:21 【问题描述】:

我现在正在 ubuntu 12 上部署一个带有 nginx 和 gunicorn 的 django 应用程序。

我配置nginx虚拟主机文件如下:

server 
    listen 80;
    server_name mydomain.com;
    access_log  /var/log/nginx/gunicorn.log;

    location / 
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    

    location /static/ 
        root /var/www/django/ecerp/erp/static/;
    


我可以很好地请求django,但是当请求静态文件时,它会以404状态响应。

我确定静态文件的根路径是正确的。

谁能帮忙?

【问题讨论】:

wiki.nginx.org/Pitfalls#Root_inside_Location_Block。 nginx.org/r/root 我还要确保您的 nginx 用户有权访问该目录。祝你好运 @pztrick 没有权限问题。我将其更改为 777。现在返回 404 而不是 403。 我自己的配置使用alias 指令而不是root。我还将静态和媒体路径放置在裸location / 之前。也许它首先路由到location /匹配? @pztrick,不是订单问题,我已经解决了,应该删除多余的static/ 【参考方案1】:

您应该使用alias 而不是rootroot 将尾随 URL 部分附加到您的本地路径(例如 http://test.ndd/trailing/part,它将添加 /trailing/part 到您的本地路径)。取而代之的是,alias 完全符合您的要求:当请求 http://test.ndd/static/ 时,/static 将准确映射到您的别名,而无需再次附加 static。

例如:

location /static 
    alias /var/www/django/ecerp/erp/static/;

如果文件/var/www/django/ecerp/erp/static/foo.html 存在,那么转到/static/foo.html 将返回其内容。

【讨论】:

【参考方案2】:

TL;DR - 你应该检查你的文件权限

偶然发现了这个问题,我已经在使用 alias 而不是 root,所以虽然现有答案是正确的,但以下内容可能对其他人有用。

在我的情况下,解决相同症状的方法是 static/ 中的文件以 root 为所有者。

一个简单的chown www-data:www-data . 解决了问题,没有更多404

【讨论】:

我也用 chmod 试过这个。 nginx 对文件实际需要哪个权限?只读似乎还不够。完全访问似乎有点过头了。 @ST-DDT 从 Nginx 访问 root 文件不是一个好主意,无论他们可能拥有什么权限。在这里使用chown 是一个更好的选择。

以上是关于在 nginx 中获取静态文件失败,出现 404的主要内容,如果未能解决你的问题,请参考以下文章

django nginx静态文件404

记一次vue2项目部署nginx静态文件404解决过程

django nginx静态文件404

使用CORS解决跨域问题

thinkphp部署服务器后出现404错误

springboot静态资源加载css或js出现404错误