错误地执行了nginx位置块

时间:2017-04-03 22:03:08

标签: caching nginx

我在nginx反向代理后面托管了一个angular2应用程序。 Angular2在技术上是一个单页面应用程序,托管在index.html中,但它使用普通路由,因此不直接请求index.html文件,而是可以请求正常查看路径,如:

  • http://my.angular.app/
  • http://my.angular.app/users
  • http://my.angular.app/users/john
  • http://my.angular.app/resource123
  • http://my.angular.app/anything

取决于,如果路由上有文件,我想提供文件(并缓存它)。否则我想提供index.html。这些是我的3个位置块:

# don't cache index.html file
location / {
    index index.html;
    expires -1;
    try_files $uri $uri/ /index.html;
}

# Cache everything with a hash for a year
location ~* "\.[0-9a-f]{16,999}(?:\.chunk|\.bundle|)\.(?:jpg|jpeg|gif|css|png|js|ico|html)$" {
    add_header Pragma public;
    add_header Cache-Control "public";

    access_log        off;
    expires           31536000; # 1 year
}

# Cache all other assets for a day
location ~* ^(?!index\.html$).*\.(?:jpg|jpeg|gif|css|png|js|ico|html)$ {
    add_header Pragma public;
    add_header Cache-Control "public";

    access_log off;
    expires 86400; # 1 day
}

我的意图是永远不要让浏览器缓存index.html文件,但其他所有内容都应该尽可能地缓存。带有散列文件的部分工作正常。问题出在普通网址

如果我请求my.angular.app/module/sub-route我仍然会收到1天的缓存标题,尽管3.位置不匹配(未定义扩展名)且第一个位置设置为expires -1

1 个答案:

答案 0 :(得分:1)

所有nginx URI都以前导/开头。

您的否定断言^(?!index\.html$)不会拒绝URI /index.html,这意味着/index.html将匹配第三个location块。