如何使 Hapi 插件仅适用于特定域或子域?
How do I make a Hapi plugin work only with a specific domain or subdomain?
我的 Hapijs 项目中有以下内容:
API 插件
前端插件
然后我有一个服务器文件夹,其中包含我的主要 index.js 文件,其中启动了 Hapi 服务器。我 link 使用 Glue 插件将所有内容都放在我的服务器文件夹中:https://www.npmjs.com/package/glue
我遇到的问题是我想为我的 api 使用子域,例如 api.locahost:8000 (api.domain.com)。但是,似乎无论我输入什么类型的子域,我都可以访问我的网站。
另外,这就像随机的。localhost:8000 转发到 locahost:8000,我仍然可以访问我网站的所有页面。
这是我的代码:
'use strict';
const Dotenv = require('dotenv');
Dotenv.config({ path: `${__dirname}/.env` });
const Glue = require('glue');
const manifest = {
server: {
port: process.env.PORT,
host: process.env.HOST
},
register: {
plugins: [
{
plugin: '~/api',
options: {
routes: {
vhost: process.env.SUBDOMAIN //api.localhost
}
}
},
{
plugin: '~/lib'
}
],
options: {
}
}
};
const options = {
relativeTo: __dirname
};
const startServer = async function () {
try {
const server = await Glue.compose(manifest, options);
await server.start();
await console.log(`Server running at: ${server.info.uri}`);
}
catch (err) {
console.error(err);
process.exit(1);
}
};
startServer();
如果您想知道 "lib" 是什么,那是我的前端目录名称。如果您查看 api 插件选项,您可以看到我添加子域的位置。
我怎样才能让我的前端插件只使用 localhost:8000 而我的 API 插件只使用 api.localhost:8000?他们需要是两个独立的服务器吗?
提前致谢。
我认为这是不可能的,但您可以使用生命周期方法访问当前路径和域,然后您可以在代码中插入某种逻辑来处理当前域。
例如,根据您的需要在订单前后更改生命周期。
exports.plugin = {
register: async function (server, options) {
server.ext('onPreHandler', async (request, h) => {
if(request.info.host !== 'YOUR_DOMAIN') return h.continue;
// you can check request.path also
// rest of the code...
return h.continue;
})
}
};
我的 Hapijs 项目中有以下内容:
API 插件 前端插件
然后我有一个服务器文件夹,其中包含我的主要 index.js 文件,其中启动了 Hapi 服务器。我 link 使用 Glue 插件将所有内容都放在我的服务器文件夹中:https://www.npmjs.com/package/glue
我遇到的问题是我想为我的 api 使用子域,例如 api.locahost:8000 (api.domain.com)。但是,似乎无论我输入什么类型的子域,我都可以访问我的网站。
另外,这就像随机的。localhost:8000 转发到 locahost:8000,我仍然可以访问我网站的所有页面。
这是我的代码:
'use strict';
const Dotenv = require('dotenv');
Dotenv.config({ path: `${__dirname}/.env` });
const Glue = require('glue');
const manifest = {
server: {
port: process.env.PORT,
host: process.env.HOST
},
register: {
plugins: [
{
plugin: '~/api',
options: {
routes: {
vhost: process.env.SUBDOMAIN //api.localhost
}
}
},
{
plugin: '~/lib'
}
],
options: {
}
}
};
const options = {
relativeTo: __dirname
};
const startServer = async function () {
try {
const server = await Glue.compose(manifest, options);
await server.start();
await console.log(`Server running at: ${server.info.uri}`);
}
catch (err) {
console.error(err);
process.exit(1);
}
};
startServer();
如果您想知道 "lib" 是什么,那是我的前端目录名称。如果您查看 api 插件选项,您可以看到我添加子域的位置。
我怎样才能让我的前端插件只使用 localhost:8000 而我的 API 插件只使用 api.localhost:8000?他们需要是两个独立的服务器吗?
提前致谢。
我认为这是不可能的,但您可以使用生命周期方法访问当前路径和域,然后您可以在代码中插入某种逻辑来处理当前域。
例如,根据您的需要在订单前后更改生命周期。
exports.plugin = {
register: async function (server, options) {
server.ext('onPreHandler', async (request, h) => {
if(request.info.host !== 'YOUR_DOMAIN') return h.continue;
// you can check request.path also
// rest of the code...
return h.continue;
})
}
};