Nginx无法正常提供/public/下非/static/路径静态文件问题求助
问题分析与解决方案
不用给每个文件/目录单独写location规则,你的问题出在当前Nginx配置只处理了/static/路径的请求,其他根路径或子目录的静态文件请求都被转发给Gunicorn(Django)处理了,但Django并没有托管这些文件的逻辑,所以返回404。
下面两种通用配置方式可以解决问题:
方式一:在根location中使用try_files
修改location /块,让Nginx先尝试从public目录找对应文件,找不到再转发给Gunicorn:
server { server_name mysite.com; # 注意这里要加分号,你原来的配置漏了 location /static/ { autoindex off; root /home/myuser/mysite.com/public/; } location / { # 先尝试在public目录找请求的文件,找不到再转发给Gunicorn try_files $uri $uri/ @proxy_to_django; } # 定义转发到Django的规则 location @proxy_to_django { proxy_pass http://localhost:8001; proxy_set_header Host $host; } }
这样,当访问mysite.com/robots.txt时,Nginx会先去/home/myuser/mysite.com/public/robots.txt找文件;访问mysite.com/bookmarks/bookmarks.html时,会去/home/myuser/mysite.com/public/bookmarks/bookmarks.html找,找到就直接返回,找不到才转发给Django处理。
方式二:配置通用静态资源location块
另一种方式是新增一个location,匹配所有非/static/的静态文件请求,优先从public目录读取:
server { server_name mysite.com; location /static/ { autoindex off; root /home/myuser/mysite.com/public/; } # 匹配根路径和子目录的静态文件,优先从public目录读取 location ~* ^/(robots\.txt|favicon\.ico|bookmarks/.*)$ { root /home/myuser/mysite.com/public/; } location / { proxy_pass http://localhost:8001; proxy_set_header Host $host; } }
这种方式更灵活,可以精确指定要匹配的文件或目录,比如上面的正则匹配了robots.txt、favicon.ico和bookmarks/下的所有内容。如果需要新增其他文件或目录,直接在正则里添加即可。
注意事项
- 别忘了给
server_name行末尾加分号,你原来的配置里漏了,这属于语法错误,可能导致Nginx无法正常启动。 - 如果public目录下有很多不同类型的静态文件,方式一的
try_files更省心,不用逐个添加规则;如果只想指定特定文件/目录,方式二更精准。
内容的提问来源于stack exchange,提问作者Jonah Bishop
相关产品推荐
相关产品推荐

