Javascript 如何使用hapi.js支持同一服务器上的多个网站?
假设我想用一个IP地址(即虚拟主机)在同一台服务器上托管我的两个网站(cats.com和dogs.com)。我想用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
/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
。如何提供模板?感谢更新此内容