位置不适用于文件但仅适用于路径

Location not working for files but only for path

我有一个 nginx.conf 看起来像这样:

server {
  ...
  root /var/opt/data/web;
  ...

  location ~* \.(?:eot|woff|woff2|ttf|js)$ {
    expires 1M;
  }

  ...

  location /one {
    root /var/opt/data/alternatives;
    try_files $uri $uri/ =404;
  }

  location /two {
    root /var/opt/data/alternatives;
    try_files $uri $uri/ =404;
  }
}

当我 curl http://localhost/one/ 时,我得到 index.html 的内容存储在 /other 中。但是当我卷曲 .../localhost/one/foo.js 时找不到文件,我在 error.log:

中得到了这个

open() "/default/foo.js" failed (2: No such file or directory)

我尝试了其他变体,例如 location ~ (one|two)location /one/ 甚至 location ~ /(one|two),但都没有用。

完整的配置包含更多 locations,但我想我的问题的原因是我将 .js 资源设置为 expire -1 的位置,因为这会阻止将根更改为我需要的。

如果这很重要:我使用 nginx 1.15.2。如果您想知道为什么我有这个奇怪的 alternatives 目录:web 目录是由 CMS 软件创建的,而 alternativesgit pulled.

nginx选择一个locationprocess a request。您的 location ~* \.(?:eot|woff|woff2|ttf|js)$ 块处理任何以 .js 结尾的 URI,其 root 值从外部块继承为 /var/opt/data/web.

如果有多个根,则需要使用 ^~ 修饰符确保那些 location 块优先。有关详细信息,请参阅 this document

例如:

server {
    ...
    root /var/opt/data/web;
    ...    
    location ~* \.(?:eot|woff|woff2|ttf|js)$ {
        expires 1M;
    }    
    ...
    location ^~ /one {
        root /var/opt/data/alternatives;
        try_files $uri $uri/ =404;

        location ~* \.(?:eot|woff|woff2|ttf|js)$ {
            expires 1M;
        }    
    }
    ...
}

如果您需要将 expires 规则应用于其他根,则需要在该范围内重复 location,如上所示。


作为替代,expires 指令可以与 map 一起使用。有关详细信息,请参阅 this document

例如:

map $request_uri $expires {
    default                            off;
    ~*\.(eot|woff|woff2|ttf|js)(\?|$)  1M;
}
server {
    ...
    root /var/opt/data/web;
    expires $expires;
    ...
    location ^~ /one {
        root /var/opt/data/alternatives;
        try_files $uri $uri/ =404;
    }
    ...
}