位置不适用于文件但仅适用于路径
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)
,但都没有用。
完整的配置包含更多 location
s,但我想我的问题的原因是我将 .js
资源设置为 expire -1
的位置,因为这会阻止将根更改为我需要的。
如果这很重要:我使用 nginx 1.15.2。如果您想知道为什么我有这个奇怪的 alternatives
目录:web
目录是由 CMS 软件创建的,而 alternatives
是 git pull
ed.
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;
}
...
}
我有一个 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)
,但都没有用。
完整的配置包含更多 location
s,但我想我的问题的原因是我将 .js
资源设置为 expire -1
的位置,因为这会阻止将根更改为我需要的。
如果这很重要:我使用 nginx 1.15.2。如果您想知道为什么我有这个奇怪的 alternatives
目录:web
目录是由 CMS 软件创建的,而 alternatives
是 git pull
ed.
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;
}
...
}