我有一个看起来像这样的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
编辑的。
答案 0 :(得分:1)
nginx
选择一个location
至process 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;
}
...
}