Javascript 如何使用hapi.js支持同一服务器上的多个网站?

Javascript 如何使用hapi.js支持同一服务器上的多个网站?,javascript,node.js,virtualhost,hapijs,Javascript,Node.js,Virtualhost,Hapijs,假设我想用一个IP地址(即虚拟主机)在同一台服务器上托管我的两个网站(cats.com和dogs.com)。我想用hapi.js编写它们,并让它们作为一个进程运行 这些站点可能有重叠的路径,例如,它们可能都有一个/about页面 如何使用hapi实现这一点?使用hapi实现这一点的一个好方法是将不同的站点放在不同的位置,并在加载插件时使用vhost修改器,最好使用 下面是一个例子: sites/dogs.js exports.register = function (server, option

假设我想用一个IP地址(即虚拟主机)在同一台服务器上托管我的两个网站(cats.com和dogs.com)。我想用hapi.js编写它们,并让它们作为一个进程运行

这些站点可能有重叠的路径,例如,它们可能都有一个
/about
页面


如何使用hapi实现这一点?

使用hapi实现这一点的一个好方法是将不同的站点放在不同的位置,并在加载插件时使用
vhost
修改器,最好使用

下面是一个例子:

sites/dogs.js

exports.register = function (server, options, next) {

    // Put all your routes for the site in here

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, reply) {

            reply('Dogs homepage');
        }
    });

    next();
};

exports.register.attributes = { name: 'dogs' };
exports.register = function (server, options, next) {

    // Put all your routes for the site in here

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, reply) {

            reply('Cats homepage');
        }
    });

    next();
};

exports.register.attributes = { name: 'cats' };
const Glue = require('glue');
const Hoek = require('hoek');

const manifest = {
    connections: [{
        port: 4000,
    }],
    registrations: [
        {
            plugin: {
                register: './sites/cats'
            },
            options: {
                routes: {
                    vhost: 'cats.com'
                }
            }
        },
        {
            plugin: {
                register: './sites/dogs'
            },
            options: {
                routes: {
                    vhost: 'dogs.com'
                }
            }
        }
    ]
};

const options = {
    relativeTo: __dirname
};

Glue.compose(manifest, options, (err, server) => {

    Hoek.assert(!err, err);
    server.start((err) => {

        Hoek.assert(!err, err);
        console.log('server started');
    });
});
sites/cats.js

exports.register = function (server, options, next) {

    // Put all your routes for the site in here

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, reply) {

            reply('Dogs homepage');
        }
    });

    next();
};

exports.register.attributes = { name: 'dogs' };
exports.register = function (server, options, next) {

    // Put all your routes for the site in here

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, reply) {

            reply('Cats homepage');
        }
    });

    next();
};

exports.register.attributes = { name: 'cats' };
const Glue = require('glue');
const Hoek = require('hoek');

const manifest = {
    connections: [{
        port: 4000,
    }],
    registrations: [
        {
            plugin: {
                register: './sites/cats'
            },
            options: {
                routes: {
                    vhost: 'cats.com'
                }
            }
        },
        {
            plugin: {
                register: './sites/dogs'
            },
            options: {
                routes: {
                    vhost: 'dogs.com'
                }
            }
        }
    ]
};

const options = {
    relativeTo: __dirname
};

Glue.compose(manifest, options, (err, server) => {

    Hoek.assert(!err, err);
    server.start((err) => {

        Hoek.assert(!err, err);
        console.log('server started');
    });
});
index.js

exports.register = function (server, options, next) {

    // Put all your routes for the site in here

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, reply) {

            reply('Dogs homepage');
        }
    });

    next();
};

exports.register.attributes = { name: 'dogs' };
exports.register = function (server, options, next) {

    // Put all your routes for the site in here

    server.route({
        method: 'GET',
        path: '/',
        handler: function (request, reply) {

            reply('Cats homepage');
        }
    });

    next();
};

exports.register.attributes = { name: 'cats' };
const Glue = require('glue');
const Hoek = require('hoek');

const manifest = {
    connections: [{
        port: 4000,
    }],
    registrations: [
        {
            plugin: {
                register: './sites/cats'
            },
            options: {
                routes: {
                    vhost: 'cats.com'
                }
            }
        },
        {
            plugin: {
                register: './sites/dogs'
            },
            options: {
                routes: {
                    vhost: 'dogs.com'
                }
            }
        }
    ]
};

const options = {
    relativeTo: __dirname
};

Glue.compose(manifest, options, (err, server) => {

    Hoek.assert(!err, err);
    server.start((err) => {

        Hoek.assert(!err, err);
        console.log('server started');
    });
});
然后,您可以使用两个cURL命令确认布线工作正常:

$ curl -H "Host: cats.com" localhost:4000/
Cats homepage

$ curl -H "Host: dogs.com" localhost:4000/
Dogs homepage

浏览器将为您设置该主机头,但当您浏览到时会这样做,或者hapi将为您提供正确的内容(前提是您的DNS配置正确)。

如果您使用的是hapi版本>=17,则尽管想法相同,但细节略有变化

// ./sites/cats.js
exports.plugin = {
  name: 'cats',
  version: '1.0.0',
  register: async function(server, options) {
    server.route({
      method: 'GET',
      path: '/',
      handler: (request, h) => {
        return 'Hello Cats!'
      }
    })
  }
}
我们希望每个网站都有一个插件。然后,一旦我们将每个站点提取到插件中(
cats
dogs
),我们就可以使用
glue
组合单独的配置,并为站点提供
hapi

在下面的例子中,插件将不知道或不关心他们正在哪个域上服务

代码 猫插件 这是用于
cats.com
的“服务器”。它返回文本
Hello Cats位于根路径,
/
。在现实生活中,它会做一些更有用的事情,在实际项目中,您可能会有更多的路由和处理程序,但想法仍然是一样的

// ./sites/cats.js
exports.plugin = {
  name: 'cats',
  version: '1.0.0',
  register: async function(server, options) {
    server.route({
      method: 'GET',
      path: '/',
      handler: (request, h) => {
        return 'Hello Cats!'
      }
    })
  }
}
狗插件 这是出现在
dogs.com
上的内容的服务器。它与
cats
插件完全相同,只是它返回文本
Hello Dogs。同样,这不是一个有用的插件,它只是用于说明

// ./sites/dogs.js
exports.plugin = {
  name: 'dogs',
  version: '1.0.0',
  register: async function(server, options) {
    server.route({
      method: 'GET',
      path: '/',
      handler: (request, h) => {
        return 'Hello Dogs!'
      }
    })
  }
}
主服务器 这是指定
vhost
的地方,将插件分配给主机
cats.com
dogs.com

// ./server.js
const Hapi = require('hapi')
const Glue = require('glue')

const manifest = {
  server: {
    host: process.env.HOST || '0.0.0.0',
    port: process.env.PORT || 8080
  },
  register: {
    plugins: [
      {
        plugin: './sites/cats',
        routes: {
          vhost: 'cats.com'
        }
      },
      {
        plugin: './sites/dogs',
        routes: {
          vhost: 'dogs.com'
        }
      }
    ]
  }
}

const options = {
  relativeTo: __dirname
}

const startServer = async function () {
  try {
    const server = await Glue.compose(manifest, options)
    await server.start()
    console.log('Hapi days for Cats and for Dogs!')
  }
  catch (err) {
    console.error(err)
    process.exit(1)
  }
}

startServer()
结果 访问不同版本 启动服务器 采样服务器输出
请注意,默认主机没有路由,因此不指定主机将导致返回
404

如何提供模板?感谢更新此内容