我有以下nginx配置,基本上有两个匹配的位置 a)包含点的路由(例如“ /js/script.js”)和 b)所有其他路线。
server {
listen 80;
server_name localhost;
root /app;
# files
# for all routes matching a dot, check for files and return 404 if not found
# e.g. /file.js returns a 404 if not found
location ~ \. {
add_header Cache-Control "public, max-age=2678400";
try_files $uri $uri/ =404;
}
# normal routes
# serve given url and default to index.html if not found
# e.g. /, /user and /foo/bar will return index.html
location / {
add_header Cache-Control "no-store";
try_files $uri $uri/ /index.html;
}
}
所有与点匹配的路由都应使用cache-control标头进行缓存,如果找不到,则应返回404。
不匹配点的路由,例如“ /用户”,默认情况下应发送index.html。
但是,这会导致非常奇怪的行为。
我有一个内容为<h1>wazzup</h1>
的index.html,当请求不带点的路线(例如, “ / asdf”:
$ curl -v localhost:8000/asdf
> Cache-Control: public, max-age=2678400
> Accept-Ranges: bytes
> ...
> <h1>wazzup</h1>
但是,尽管在另一个位置块中定义了高速缓存控制标头,但也会发送。总而言之,结果是正确的,但是以某种方式混淆了标题。为什么?
要自己尝试,您可以像这样运行docker映像:
docker run -p 8000:80 -v /tmp/test:/app steebchen/nginx-spa
在/ tmp / test目录中创建index.html和script.js,然后访问它:
curl -v localhost:8000/asdf // should return the contents of index.html
curl -v localhost:8000/script.js
完整的Dockerfile是available on Github。
答案 0 :(得分:0)
答案实际上很简单,我只是自己弄清楚了。
第二个位置是匹配的,因为后备时间为index.html
,而且显然这条路线中包含一个点。
我只是将位置编辑为\.(?!html)
,该位置与除html文件之外的所有内容都匹配:
location ~ \.(?!html) {
add_header Cache-Control "public, max-age=2678400";
try_files $uri $uri/ =404;
}