Расположение не работает для файлов, но только для пути - PullRequest
0 голосов
/ 07 октября 2018

У меня есть 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" не удалось (2: такого файла нет иликаталог)

Я пробовал другие варианты, такие как location ~ (one|two), location /one/ или даже location ~ /(one|two), но все они не работали.

Полная конфигурация состоит из гораздо большего числа location с, но я предполагаю, что причиной моей проблемы является местоположение, в котором я установил .js ресурсы на expire -1, потому что это предотвращает изменение корня на что-либоМне нужно.

Если это имеет значение: я использую nginx 1.15.2.Если вам интересно, почему у меня есть этот странный каталог alternatives: каталог web создается программным обеспечением CMS, а alternatives - git pull ed.

1 Ответ

0 голосов
/ 07 октября 2018

nginx выбирает один location - для обработки запроса .Ваш блок location ~* \.(?:eot|woff|woff2|ttf|js)$ обрабатывает любой URI, который заканчивается на .js, а его значение root наследуется от внешнего блока как /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;
    }
    ...
}
...