嵌套位置无法正常工作

嵌套位置无法正常工作

我无法调试这部分 nginx 配置:
我想为.pdf文件的所有请求添加一些标头
,然后我想删除添加到我的 veiw 目录中的令牌,以避免不必要的浏览器缓存:

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}

没有 nginx 语法错误,但请求.pdf显示 404 未找到错误,这意味着重写不适用于该请求。

非常感谢您的帮助,
谢谢

答案1

nginx选择一个location来处理请求时,它可能选择内部或外部location块。它不会将两者的语句组合起来。

嵌套的rewrite不会继承location。如果您希望rewrite应用于所有位置,则应将其置于server块作用域中。

您的语句的正则表达式rewrite足够具体,可以按原样移动。

例如:

rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

当然,在两个块中重复该rewrite语句可能会更有效location


另一种方法是完全避免rewrite使用正则表达式,location通过使用指令来删除反缓存令牌alias。请参阅这个文件了解更多信息。

例如:

location ~ "^(?<prefix>/static)[0-9]{10}(?<suffix>/.*)$" {
    alias /path/to/root$prefix$suffix;

    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

请注意,正则表达式location块与前缀块的评估顺序不同location。请参阅这个文件了解详情。

答案2

虽然这个问题的最佳答案是我检查过的最佳答案,但我想发布我解决问题的解决方案。没有必要定义嵌套位置块来向某些请求添加标头。相反,我使用 if 来检查正则表达式条件并执行我想要的操作。
查看我为处理此问题而编写的以下块:

location /static {
    if ( $request_uri ~* \.pdf$ ) {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }

    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}

相关内容