使用nginx的Express js应用程序 - 在提供子文件夹时静态文件存在冲突

4
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/;
    }
    ...
}

我已经为此奋斗了一段时间。我的Express应用程序在nginx的子文件夹中。下面是我在/sites-available/中nginx文件中的代码。当我删除静态文件位置时,应用程序的图像和CSS被代理,但如果nginx文件中有静态文件缓存,则Express应用程序的图像和CSS文件不会显示在网站上。

请问有人可以帮忙吗?

1个回答

4
正则表达式位置在nginx请求处理中优先于前缀位置块。以下是nginx location指令文档的相关摘录。
我强烈建议您仔细阅读它们,因为很多人不这样做,错过了基础知识。
在理解关键字之前,有几个例子:
- 前缀位置:location /toto { [...] } - 正则表达式位置:location ~ /toto { [...] } 摘录如下:
[ ... ]
为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照它们在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配时终止,并使用相应的配置。如果没有与正则表达式匹配的内容,则使用先前记住的前缀位置的配置。
如果具有最长匹配前缀位置的“^~”修改符,则不检查正则表达式。
此外,使用“=”修饰符可以定义URI和位置的精确匹配。如果找到精确匹配,则搜索终止。[...]
以下是其他一些示例,说明修改位置查找顺序的两个运算符:
- location ^~ /toto { [...] }:具有高于正则表达式位置的前缀位置 - location = /toto { [...] }:精确前缀位置(精确匹配,优先级最高)
总之,在处理传入请求URI时,位置选举的优先级列表为:
1. location = /too 2. location ^~ /toto 3. location ~ /toto 4. location /toto 因此,解决问题的更干净的方法是使用:
location ^~ /app {
    alias /path/to/app/public/; 
    try_files $uri $uri @app;
}

这个不起作用。CSS/JS/Images 显示 404 找不到。 - gurupal singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接