Как да пренасочите множество поддомейни към едно и също работещо експресно приложение

Създавам SaaS приложение в NodeJS и използвам Express framework. Отделните членове на уебсайта имат URL адрес с персонализиран поддомейн за влизане.

Например, компания, наречена ABC Corp, може да влезе в abc.example.com, а друга компания, наречена Sony, може да влезе в sony.example.com

Някаква идея как мога да пренасочвам/насочвам множество поддомейни към едно и също приложение?


person Sparky    schedule 21.08.2013    source източник
comment
Ако предоставите малко повече информация, това ще ни помогне да дадем много по-добър отговор за нас.   -  person Amol M Kulkarni    schedule 21.08.2013
comment
Каква повече информация ви трябва @AmolMKulkarni? Това, от което се нуждая, е да насоча abc.domain.com и xyz.domain.com към едно и също експресно приложение.   -  person Sparky    schedule 21.08.2013
comment
Но не само тези 2 поддомейна. Трябва да съпоставя поддомейни със заместващи символи към едно и също приложение. Тоест *.domain.com трябва да показва същото приложение.   -  person Sparky    schedule 21.08.2013


Отговори (2)


Можете да използвате пакета express-subdomain. Ако приемем, че имате папка routes, съдържаща abc.js и sony.js файлове, които съответно експортират маршрути за влизане за поддомейните abc и sony, можете да имате следното в index.js или какъвто и да е файл, от който вашият експресен сървър слуша.

const subdomain = require('express-subdomain');
const express = require('express');
const app = express();
const abcRoutes = require('./routes/abc');
const sonyRoutes = require('./routes/sony');
const port = process.env.PORT || 3000;

// use the subdomain middleware
app.use(subdomain('abc', abcRoutes));
app.use(subdomain('sony', sonyRoutes));

// a simple get route on the top-level domain
app.get('/', (req, res) => {
  res.send('Welcome to the Home Page!');
});

// add any other needed routes

module.exports = app.listen(port, () => {
  console.log('Server listening on port ' + port);
});

Тогава вашият сървър ще бъде активен и ще работи според очакванията
http://example.com/ --› Добре дошли в началната страница!
http://abc.example.com/login --› (Вашата страница за вход за abc)
http://sony.example.com/login --› (Вашата страница за вход за sony )

За да тествате поддомейни локално, трябва да ги добавите към вашия /etc/hosts файл. (изисква sudo разрешения)

127.0.0.1      localhost
127.0.0.1      example.com
127.0.0.1      abc.example.com
127.0.0.1      sony.example.com

Еквивалентът на /etc/hosts файл в Windows е на %systemroot%\system32\drivers\etc

За по-добри подробности относно локалното настройване на локални домейни проверете тук

Можете да направите повече с пакета за поддомейни. Той приема заместващи символи и можете да го използвате, за да проверите API ключовете, ако имате нужда от такава функция.

Вижте документацията за пакета express-subdomain на адрес https://npmjs.com/package/express-subdomain

person Obumuneme Nwabude    schedule 31.10.2020

Всъщност можете да управлявате този конкретен маршрут или широк диапазон, след което отидете на Reg Exp (което ви позволява за да направите това app.get(new RegExp('(your|string)\/here'), function…), което искате да пренасочите и след това следвайте действието за пренасочване, което прави нещо подобно на кода по-долу:

response.writeHead(302, {
  'Location': 'yourpath/page.html'
  //add other headers here...
});
response.end();


Актуализация 1 : [според коментарите и други актуализации]

След това се опитвате да обработите всички заявки със следното приложение:

express()
.use(express.vhost('abc.example.com', require('/path/to/loginApp').app))
.use(express.vhost('sony.example.com', require('/path/to/loginApp').app))
.listen(80)

където /path/to/loginApp могат да бъдат абсолютни пътища или относителни пътища.

Надявам се това да реши проблема ви.

Актуализация 2:

Всъщност, когато дойде заявка, събитието за заявка се повдига на HTTP сървър. Така че основно се обработва от express, express.vhost е функция на междинен софтуер, която повдига събитието за заявка на друго копие на HTTP сървър, така работи.

По-долу е кодът:

function vhost(req, res, next){
    if (!req.headers.host) return next();
    var host = req.headers.host.split(':')[0];
    if (req.subdomains = regexp.exec(host)) {
      req.subdomains = req.subdomains[0].split('.').slice(0, -1);
      server.emit('request', req, res);
    } else {
      next();
    }
  };
person Amol M Kulkarni    schedule 21.08.2013
comment
app.get(new RegExp('(your|string)\/here'), function…) е за съвпадение на неща, които идват след domain.com/ (път), нали? Не е за *.domain.com, нали? - person Sparky; 21.08.2013
comment
Разбрах проблема ви сега.. Моля, проверете актуализирания отговор.. Надяваме се, че можете да използвате reg exp за широкия си набор от домейни... Приятно проучване :) - person Amol M Kulkarni; 21.08.2013
comment
Благодаря @Amol. Приложението ми е само тестово приложение от 1 страница. Вижте кода на paste.ubuntu.com/6009679 Къде да добавя кода на vhost тук и какво ще бъде /path/to/loginApp в този случай? Можете ли да поставите някаква модификация на paste.ubuntu.com? - person Sparky; 21.08.2013
comment
Нямам няколко домейна, които да тествам и да ви покажа правилния код, но съм сигурен, че можете да направите нещо като това, което споменах в актуализацията. Но ако искате да знаете как работи. Ще сложа някакъв код, който сам обяснява как пренасочва. - person Amol M Kulkarni; 21.08.2013