使用nginx表达js应用程序 - 在提供子文件夹时与静态文件冲突

时间:2014-11-14 20:02:19

标签: node.js express nginx

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文件不会显示在网站上。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

正则表达式位置优先于nginx请求处理中的前缀位置块。以下是nginx location directive documentation的相关摘录。

我强烈建议您仔细阅读,因为许多人不这样做并且错过了基础知识。

之前要了解关键字的几个例子:

  • 前缀位置:location /toto { [...] }
  • 正则表达式位置:location ~ /toto { [...] }
  

[...]

     

要查找与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照它们在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配,则使用先前记住的前缀位置的配置。

     

[...]

     

如果最长匹配前缀位置具有“^〜”修饰符,则不检查正则表达式。

     

[...]

     

此外,使用“=”修饰符可以定义URI和位置的精确匹配。如果找到完全匹配,则搜索终止。 [...]

一些其他示例来说明修改位置查找顺序的两个运算符:

  • location ^~ /toto { [...] }:优先级高于正则表达位置的前缀位置
  • location = /toto { [...] }:确切的前缀位置(完全匹配,最高优先级)

总而言之,传入请求URI的位置选择期间的优先级列表是:

  1. location = /too
  2. location ^~ /toto
  3. location ~ /toto
  4. location /toto
  5. 因此,解决问题的更简洁方法是使用:

    location ^~ /app {
        alias /path/to/app/public/; 
        try_files $uri $uri @app;
    }