部署Django应用时,启用Nginx Cache-Control后无法提供缓存数据
解决Nginx添加Cache-Control后静态资源无法访问的问题
你的问题核心是Nginx的location匹配优先级冲突:正则匹配(~*前缀)的优先级高于普通前缀匹配。当请求/static/或/media/目录下的svg/ico/woff等文件时,会优先命中那个单独的正则location,但这个location里没有指定资源的实际路径(root/alias),导致Nginx找不到文件返回错误。
下面是几种可行的解决方法:
方法一:合并缓存规则到静态资源location(最推荐)
既然这些需要缓存的资源都在/static/和/media/目录下,直接在对应的location里添加缓存配置即可,无需单独写正则location:
server { listen 80 default_server; listen [::]:80 default_server; root /app/; location / { proxy_pass http://landing_page; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } location /static/ { alias /app/staticfiles/; try_files $uri $uri/ ; # 添加缓存规则 expires 1M; add_header Cache-Control "public"; } location /media/ { alias /app/media/; try_files $uri $uri/ ; # 如果media目录下的这些文件也需要缓存,取消下面两行注释 # expires 1M; # add_header Cache-Control "public"; } }
方法二:提升静态资源location的匹配优先级
给/static/和/media/的location加上^~修饰符,让前缀匹配的优先级高于正则匹配,确保这些目录下的资源优先被正确处理:
server { listen 80 default_server; listen [::]:80 default_server; root /app/; location / { proxy_pass http://landing_page; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } # 加^~提升优先级 location ^~ /static/ { alias /app/staticfiles/; try_files $uri $uri/ ; } # 加^~提升优先级 location ^~ /media/ { alias /app/media/; try_files $uri $uri/ ; } # 现在这个正则location只会匹配不在/static和/media下的目标文件 location ~* \.(svg|ico|woff|woff2|ttf)$ { # 如果有其他路径的这些文件,需要指定root/alias # root /path/to/other/files; expires 1M; add_header Cache-Control "public"; } }
方法三:给正则location补充路径配置
如果确实需要单独的正则location,要在里面补充资源路径的判断,确保Nginx能找到文件:
location ~* \.(svg|ico|woff|woff2|ttf)$ { # 根据请求路径匹配对应的实际目录 if ($request_uri ~ ^/static/) { alias /app/staticfiles/; } if ($request_uri ~ ^/media/) { alias /app/media/; } expires 1M; add_header Cache-Control "public"; }
注意:Nginx里的if指令要谨慎使用,仅在必要时采用这种方式。
内容的提问来源于stack exchange,提问作者kazem qanati
相关产品推荐
相关产品推荐

