nginx从不同的位置指令发送标头

时间:2018-10-02 17:59:56

标签: nginx

我有以下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

1 个答案:

答案 0 :(得分:0)

答案实际上很简单,我只是自己弄清楚了。

第二个位置是匹配的,因为后备时间为index.html,而且显然这条路线中包含一个点。

我只是将位置编辑为\.(?!html),该位置与除html文件之外的所有内容都匹配:

location ~ \.(?!html) {
    add_header Cache-Control "public, max-age=2678400";
    try_files $uri $uri/ =404;
}