我在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
。
答案 0 :(得分:1)
所有nginx
URI都以前导/
开头。
您的否定断言^(?!index\.html$)
不会拒绝URI /index.html
,这意味着/index.html
将匹配第三个location
块。