使用nginx作为节点反向代理服务根静态文件

时间:2015-07-24 07:14:31

标签: node.js nginx configuration

我有一个nodejs服务器,它使用nginx作为反向代理服务器。那部分没问题,静态文件位置设置正确。但我希望根地址能够提供静态html文件,而且我不知道如何配置nginx,以便根网址不会被重定向到节点应用程序。这是我的服务器块:

upstream promotionEngine {
 server 127.0.0.1:3001;
}

server {
    listen       3000;
    server_name  localhost;
    root C:/swaven/dev/b2b.pe/promotionEngine/templates/;
    index index.html;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://promotionEngine;
        proxy_redirect off;
    }

    location /public/ {
      alias C:/swaven/dev/b2b.pe/promotionEngine/public/;
    }

    location /assets/ {
      alias C:/swaven/dev/b2b.pe/promotionEngine/assets/;
    }
}

htttp:// localhost:3000 / ping和http://localhost:3000/public/js/riot.js已正确提供 但是http://localhost:3000一直被发送到节点服务器,我希望它返回静态index.html。如果我删除/ location bloc,则正确提供html文件。我如何配置该位置作为所有URL的反向代理,除了根目录?

3 个答案:

答案 0 :(得分:1)

您可以使用 = / 这种类型的位置因查找而具有更高的优先级:

location =/ {
  root ...
}

此请求甚至不会尝试到达其他位置。

答案 1 :(得分:1)

更新 :(基于评论和讨论)

您需要2个确切的位置块。一个截取/位置,另一个截取仅/index.html

nginx docs上描述了一个确切的位置块:

  

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

仅使用index指令不起作用。因为nginx creates an internal redirect允许其他块匹配index.html。哪个被代理块拾取。

upstream promotionEngine {
 server 127.0.0.1:3001;
}

server {
    listen       3000;
    server_name  localhost;

    # Do an exact match on / and rewrite to /index.html
    location = / {
      rewrite ^$ index.html;
    }

    # Do an exact match on index.html to serve just that file
    location = /index.html {
      root C:/swaven/dev/b2b.pe/promotionEngine/templates/;
    }

    # Everything else will be served here
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass http://promotionEngine;
      proxy_redirect off;
    }

    location /public/ {
      alias C:/swaven/dev/b2b.pe/promotionEngine/public/;
    }

    location /assets/ {
      alias C:/swaven/dev/b2b.pe/promotionEngine/assets/;
    }
}

答案 2 :(得分:-1)

Something like this, adjust for your own use case.

http {
    map $request_uri $requri {
        default          1;
        /                0;
    }
...........
    server {
        listen       80;
        server_name  www.mydomain.eu;
        root   '/webroot/www.mydomain.eu’;
        if ($requri) { return 301 https://www.mydomain.eu$request_uri; }
        location / {
            ..........
        }
    }