更改expressjs app的根文件夹

时间:2018-02-09 03:45:38

标签: node.js express nginx reverse-proxy

我正在尝试在nodejs中设置twilio客户端快速入门应用程序。我正在使用nginx作为反向代理,以便向http://example.com/calls发出请求,nginx将请求路由到localhost:3000,我在其中运行twilio nodejs快速启动。问题是expressjs期望提供文件,好像我在没有子目录的情况下调用http://example.com

我知道我可以使用app.get,但我不确定这个特定应用的配置方式。现在它有:

const http = require('http');
const path = require('path');
const express = require('express');
const bodyParser = require('body-parser');

const router = require('./src/router');

// Create Express webapp
const app = express();
app.use(express.static(path.join(__dirname, 'public')));// <-Pretty sure I'm supposed to change something here
app.use(bodyParser.urlencoded({extended: false}));

在运行节点的index.js中是

/var/www/example.com/calls/index.js

我认为应该提供的静态内容是

/var/www/example.com/calls/public/index.html

如何更改此内容以使快递找到内容?

Nodejs肯定收到了请求。错误为Cannot GET /calls/,标题X-Powered-By存在并设置为Express

修改

我本来希望按照here的说明操作,但我的防火墙不允许我进行更改。由于我已经打开了端口80和443,因此我决定将我的下一个应用程序代理到我已在系统上运行的域的子文件夹。到目前为止提供的两个解决方案都允许提供/public文件夹中的index.html文件,但是nginx无法提供js文件或位于同一文件夹中的css文件。

app.use('/calls',express.static(path.join(__dirname, '/public')));

目前正在https://example.com/calls投放index.html文件,这很棒。什么臭是nginx不知何故没有将https://example.com/calls/site.css的请求传递给nodejs。

如果我添加行

rewrite ^/cawls(.*)$ $1 break;

然后找不到任何东西。

这是nginx电话。

    location ~/calls(.*)$ {
#        rewrite ^/calls(.*)$ $1 break;
        proxy_pass   http://127.0.0.1:3000;
    }

Herehere以前是与此问题相关的问题,似乎没有人能够得到答案。

2 个答案:

答案 0 :(得分:1)

我还没有看到express.static用于HTML。从路线上提供服务怎么样?

app.get('/', function(req, res) {
  res.sendFile(path.join(__dirname, 'public/index.html'));
})

答案 1 :(得分:1)

Twilio开发者传道者在这里。

这里的问题是,express对您的/calls路线一无所知。它希望在其应用程序根目录中提供内容。您可以通过将/calls路由附加到静态中间件来在应用中修复此问题,如下所示:

app.use('/calls', express.static(path.join(__dirname, 'public')));

但这意味着您的快递应用程序知道您使用nginx反向代理的其他应用程序。相反,我建议您将nginx配置更新为代理通行证,但为您的快递应用删除/calls路由。

我猜你有一些看起来有点像这样的nginx配置:

location /calls {
    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://localhost:3000;
    proxy_redirect off;
}

如果您向此块添加一行,它应该删除/calls路由以获得您的快递应用的好处。

rewrite ^/calls(/.*)$ $1 break;

让我知道这些事情是否有帮助!