upstream app {
server localhost:3000;
}
server {
...
# If I comment this location out, images are displayed on the website
location ~* \.(?:jpg|jpeg|png|gif|swf|xml|txt|css|js)$ {
expires 6004800;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
...
location /app {
alias /path/to/app/public/;
try_files $uri $uri @app;
}
location @app {
rewrite /app(.*) $1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $proxy_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://app;
proxy_redirect http://app/ /app/;
}
...
}
我为此苦苦挣扎了一段时间。我在 nginx 下的子文件夹中有一个 Express 应用程序。上面是 /sites-available/ 中我的 nginx 文件中的代码。当我删除静态文件的位置时,应用程序的图像和 css 会被代理,但如果静态文件缓存位于 nginx 文件中,则 Express 应用程序的图像和 css 文件不会显示在网站上。
有人可以帮忙吗?
在 nginx 请求处理中,正则表达式位置优先于前缀位置块。以下是nginx的相关摘录位置指令文档 http://nginx.org/en/docs/http/ngx_http_core_module.html#location.
我强烈建议您仔细阅读它们,因为很多人都没有这样做并且错过了基础知识。
先看几个例子来理解关键词:
- 前缀位置:
location /toto { [...] }
- 正则表达式位置:
location ~ /toto { [...] }
[ ... ]
为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序进行检查。正则表达式的搜索在第一个匹配处终止,并使用相应的配置。如果没有找到与正则表达式的匹配,则使用之前记住的前缀位置的配置。
[ ... ]
如果最长匹配前缀位置具有“^~”修饰符,则不检查正则表达式。
[ ... ]
此外,使用“=”修饰符可以定义 URI 和位置的精确匹配。如果找到完全匹配,则搜索终止。 [...]
其他几个例子来说明修改位置查找顺序的两个运算符:
-
location ^~ /toto { [...] }
:优先级高于正则表达式位置的前缀位置
-
location = /toto { [...] }
:精确前缀位置(精确匹配,最高优先级)
综上所述,传入请求 URI 的位置选择期间的优先级列表为:
location = /too
location ^~ /toto
location ~ /toto
location /toto
因此,解决问题的更干净的方法是使用:
location ^~ /app {
alias /path/to/app/public/;
try_files $uri $uri @app;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)