如何在NGINX中为两个Django应用从不同目录提供静态文件
Nginx配置多静态目录解决方法
你可以通过两种可靠的方式实现需求,让Nginx在/static/路径下优先查找pages应用的静态文件,找不到再匹配admin应用的:
方法一:直接指定文件路径(简洁高效)
server { server_name x.x.x.x; client_max_body_size 8M; access_log /webapps/logs/project/nginx-access.log; error_log /webapps/logs/project/nginx-error.log; # 匹配所有/static/开头的请求 location ^~ /static/(.*) { # 优先查找pages应用的静态文件,失败则尝试admin应用,最后返回404 try_files /webapps/project/pages/static/$1 /webapps/project/admin/static/$1 =404; } }
这里用正则捕获/static/后的文件名部分$1,直接映射到两个静态目录的对应文件,逻辑清晰且减少内部跳转。
方法二:使用命名location(便于扩展配置)
如果需要给不同应用的静态文件设置不同缓存策略或其他规则,推荐这种方式:
server { server_name x.x.x.x; client_max_body_size 8M; access_log /webapps/logs/project/nginx-access.log; error_log /webapps/logs/project/nginx-error.log; location /static/ { # 尝试当前路径(无默认root则直接跳转),失败后依次匹配命名location try_files $uri @pages_static @admin_static; } # pages应用静态文件处理 location @pages_static { alias /webapps/project/pages/static/; # 可选:添加静态文件缓存配置 expires 30d; add_header Cache-Control "public, immutable"; } # admin应用静态文件处理 location @admin_static { alias /webapps/project/admin/static/; expires 30d; add_header Cache-Control "public, immutable"; } }
之前配置的问题说明
- 重复alias错误:Nginx的单个
location块内只能存在一个alias或root指令,不能同时声明多个。 - try_files逻辑问题:你之前的
try_files $uri @static @static2中,$uri会尝试在当前location的默认root下查找(未设置则用Nginx默认的html目录),这一步大概率会失败,虽然最终会跳转到命名location,但逻辑冗余且容易出问题。
内容的提问来源于stack exchange,提问作者MecaTheclau
相关产品推荐
相关产品推荐

