1

我有一个看起来像这样的 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. 但是当我 curl.../localhost/one/foo.js找不到文件时,我在 error.log 中得到了这个:

open() "/default/foo.js" 失败(2:没有这样的文件或目录)

我尝试了其他变体,例如location ~ (one|two),location /one/甚至location ~ /(one|two),但它们都不起作用。

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

如果这很重要:我使用 nginx 1.15.2。如果您想知道为什么我有这个奇怪alternatives的目录:该web目录是由 CMS 软件在alternativesedgit pull时创建的。

4

1 回答 1

1

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

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

例如:

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. 有关详细信息,请参阅此文档

例如:

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;
    }
    ...
}
于 2018-10-07T08:31:03.233 回答