回答
收藏
分享
举报
nginx代理多级目录的静态资源提示404
提问于2022-12-15 16:31

浏览 2.6k

ginx代理静态目录后,无法访问静态目录下的多级目录的资源。

环境:docker + nginx-1.22.0

比如:http://127.0.0.1:80/statics/applet/test.png
可以正常访问,

比如:https://域名:443/applet/img/user/fitness_logo2.png

路径末尾会自动加上 “/”, 同时显示404,错误如下:

[error] 255#255: *4439 "/app/docker/statics/applet/img/user/fitness_logo2.png/index.html" is not found (20: Not a directory), client: 171.37.95.205, server: 这里是域名,已删除, request: "GET /applet/img/user/fitness_logo2.png/ HTTP/1.1", host: "这里是域名,已删除"

我试了两个配置都没能解决这个问题:

  尝试一:访问 /applet/img/user/fitness_logo2.png 提示404

location / {
root /app/docker/statics/web;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /applet {
root /app/docker/statics;
index index.html;
}

    尝试二:访问 /applet/img/user/fitness_logo2.png 提示404

location / {
root /app/docker/statics/web;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /applet {
alias /app/docker/statics/applet;
}


这两次尝试打印的都是上面提到的错误。因为静态目录下有很多目录,目录里面存在很多图片,我想通过nginx代理访问到这些图片,但尝试了很久仍没能解决,劳烦诸位大神支个招~~

  

  


已修改于2023-03-17 17:45



写下您的回答
发表回答
全部回答(2)

按点赞数排序

按时间排序

根据你提供的配置和错误信息,有几个问题可能导致你无法访问多级目录的资源。下面是可能的解决方案:


1. 尝试一:访问/applet/img/user/fitness_logo2.png 提示404的配置:

```

location / {

    root /app/docker/statics/web;

    try_files $uri $uri/ /index.html;

    index index.html index.htm;

}

location /applet {

  root /app/docker/statics;

  index index.html;

}

```

这个配置中,`location /applet` 指定了根目录为 `/app/docker/statics`,而你的资源实际路径是 `/app/docker/statics/applet`。因此,你需要在 `location /applet` 的配置中添加 `/applet` 部分,以便正确地指向资源路径。修改后的配置如下:

```

location / {

    root /app/docker/statics/web;

    try_files $uri $uri/ /index.html;

    index index.html index.htm;

}

location /applet {

  root /app/docker/statics;

  index index.html;

  try_files $uri $uri/ /applet$uri /applet$uri/ =404;

}

```


2. 尝试二:访问/applet/img/user/fitness_logo2.png 提示404的配置:

```

location / {

    root /app/docker/statics/web;

    try_files $uri $uri/ /index.html;

    index index.html index.htm;

}

location /applet {

  alias /app/docker/statics/applet;

}

```

在这个配置中,你使用了 `alias` 指令来映射 `/applet` 到 `/app/docker/statics/applet` 目录。但是,由于你的请求是 `/applet/img/user/fitness_logo2.png`,Nginx 尝试将请求 `/applet/img/user/fitness_logo2.png/` 解析为目录,并在该目录下寻找索引文件,导致出现错误。为了解决这个问题,你可以尝试在 `location /applet` 的配置中使用 `try_files` 指令来显式指定文件的匹配。修改后的配置如下:

```

location / {

    root /app/docker/statics/web;

    try_files $uri $uri/ /index.html;

    index index.html index.htm;

}

location /applet {

  alias /app/docker/statics/applet;

  try_files $uri $uri/ =404;

}

```

赞同

0

回复举报

回答于2023-07-05 20:10



回复名蒸蛋·柯南
回复

根据你提供的配置和错误信息,问题可能出在两个地方。首先,你的`location /applet`块中没有包含`try_files`指令,这可能导致请求的文件无法正确处理。其次,由于请求的URI以斜杠(/)结尾,NGINX会尝试将其作为目录进行处理,而不是文件。


下面是一个修改后的配置示例,尝试解决这个问题:


```nginx

location / {

   root /app/docker/statics/web;

   try_files $uri $uri/ /index.html;

   index index.html index.htm;

}


location /applet {

   alias /app/docker/statics/applet;

   try_files $uri $uri/ =404;

}

```


在这个配置中,我添加了`try_files $uri $uri/ =404;`指令来处理`/applet`路径下的请求。`try_files`指令会依次尝试请求的文件和目录,如果都不存在,则返回404错误。


请确保将上述配置添加到你的NGINX配置文件中,并重新加载NGINX以使更改生效。如果问题仍然存在,请检查文件系统中的路径和权限是否正确,并确保静态资源确实存在于指定的目录中。


另外,请注意,如果你正在使用HTTPS进行访问,你需要在NGINX配置中添加SSL证书和密钥的相关配置,以便支持HTTPS连接。

赞同

0

回复举报

回答于2023-07-05 20:07



回复名蒸蛋·柯南
回复
提问者
il3885
这家伙很懒还未留下介绍~
0
文章
1
问答
0
粉丝
相关问答

options请求?需要跨域访问? 

点赞 0
浏览 1.7k

sticky模块只能在linux下吧,win下没有。tomcat好像有个session复制吧,或者可以用共享session。

点赞 0
浏览 1.4k

没办法完全不受影响的,因为mirror是子请求,当子请求未结束时,主请求消耗的内存至少是无法释放的。你可以尝试在/mirror里,把超时时间大幅度调低,包括connect/read/send,再压下看看。

点赞 0
浏览 2.7k