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下的子文件夹中有一个快速应用程序。上面是/ sites-available /中我的nginx文件中的代码。当我删除静态文件的位置时,应用程序的图像和css被代理,但如果静态文件缓存在nginx文件中,那么express应用程序的图像和css文件不会显示在网站上。
有人可以帮忙吗?
答案 0 :(得分:4)
正则表达式位置优先于nginx请求处理中的前缀位置块。以下是nginx location directive documentation的相关摘录。
我强烈建议您仔细阅读,因为许多人不这样做并且错过了基础知识。
之前要了解关键字的几个例子:
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;
}