Nginx特定于子域​​的静态文件

时间:2016-01-25 02:20:18

标签: regex node.js nginx

我有一个在localhost:8000上运行的NodeJs应用程序,并使用Nginx作为代理服务器。这是在Nodej上运行的唯一应用程序,而其他应用程序是基于PHP的。

我正在尝试在Nginx中设置代理,将所有请求从“http://localhost/NodeApp/”重定向到“http://localhost:8000/”。只有来自此nodeapp的css / js / images文件才能由Nginx直接获取。所有其他请求都定向到Apache服务器。 Nginx配置就像这样 -

#Need to modify this code to fetch static files for NodeApp only!
location ~ ^/(uploads/|vendor/|images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
  root /var/www/NodeApp/public;
  access_log off;
}

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:8000/;
}

以上Nginx配置会破坏其他应用程序,因为它在NodeApp公用文件夹中查找静态文件。我应该如何修改上面的配置只适用于“localhost / NodeApp /”

我尝试了下面的配置但是打破了NodeApp静态文件夹有子文件夹 -     /公/ JS /引导/     /公/ JS /日期选择器/     /公/ CSS /引导/     /公/ CSS /日期选择器/     /公/上传/ PDF /     /公共/图像/

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://OneDesktop/;
    alias /var/www/NodeApp/public/;
}

有什么建议吗?我尝试过很多东西,但没有运气!

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是Node应用程序不仅仅是一个URI,而是URI的集合。最干净的方法是修改应用程序本身,使其低于/NodeApp/(包括其中的静态资源)。

在当前情况下,Node应用程序的资源文件与其他托管应用程序的资源文件的命名空间重叠,并且很难定义规则来分隔这两个重叠的命名空间。

一个(不太理想)选项是要求nginx从一个文档根目录提供文件,如果原始文件不存在,则推迟到另一个文档根目录。

这样的事情:

root /other/application/root;

location / {
    index ...;
    try_files $uri $uri/ =404;
}

location @other {
}

location ~ \.php$ {
    try_files $uri =404;
    ... 
}

location ~ ^/(uploads/|vendor/|images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
    root /var/www/NodeApp/public;
    access_log off;
    try_files $uri @other;
}

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:8000/;
}

location @other块将提供来自其他应用程序根目录的静态文件。 PHP位置块是第一个正则表达式location,因此它优先。