Nginx如何将非摘要favicon.ico请求映射为Rails带摘要的favicon资源
解决方案
直接在你现有的Nginx配置中,在/assets/对应的location块之前新增如下配置即可:
location = /favicon.ico { # 通配符匹配任意版本的带摘要favicon文件,找到第一个存在的就返回 try_files /assets/favicons/favicon-*.ico =404; # 缓存策略和你现有assets配置保持一致 expires 1y; add_header Cache-Control public; add_header Last-Modified ""; add_header ETag ""; gzip_static on; gzip off; }
规则说明
location = /favicon.ico是精准匹配规则,仅处理/favicon.ico的请求,优先级高于普通正则匹配,不会影响其他静态资源的处理逻辑try_files会自动扫描指定路径下匹配通配符的文件,Rails保留的3个版本中任意一个存在就会直接返回,完全符合需求- 缓存、压缩配置和你现有/assets/规则完全一致,保证静态资源的访问策略统一
异常兼容方案
如果你使用的Nginx版本对try_files的通配符支持有问题,可以改用rewrite内部重写的方案,效果完全一致:
location = /favicon.ico { # 内部重写路径,不会改变用户端地址栏显示 rewrite ^ /assets/favicons/favicon-*.ico break; # 相同的缓存压缩配置 expires 1y; add_header Cache-Control public; add_header Last-Modified ""; add_header ETag ""; gzip_static on; gzip off; }
生效方式
配置修改完成后,先执行nginx -t检查配置语法是否合法,确认没有报错后执行nginx -s reload即可生效。如果你的favicon实际存放路径和示例的/assets/favicons/不一致,替换成你自己的实际路径即可。
内容的提问来源于stack exchange,提问作者nmott
相关产品推荐
相关产品推荐

