60 votes

Comment puis-je configurer plusieurs sous-domaines dans Express.js ou Connect.js ?

J'ai l'habitude de travailler avec httpd (Apache) qui fournit un moyen de configurer les sous-domaines qui sont mappés à un répertoire. Comment puis-je faire la même chose dans Connect.js/Express.js ? Je vois que la seule chose que j'ai, ce sont des routes que je ne suis pas sûr de pouvoir utiliser pour configurer des sous-domaines. J'ai des sous-domaines comme m.mysite.com, sync.mysite.com, etc.

Quelqu'un peut-il m'aider ?

1 votes

La réponse acceptée devrait être mise à jour car la réponse alternative est une bien meilleure solution à ce problème.

128voto

Adrien Points 5142

Ou alternativement, vous pouvez utiliser vhost .

Ensuite, créez plusieurs sites dans leur propre répertoire et exportez l'application express, par exemple. /path/to/m/index.js :

var app = express()
/* whatever configuration code */
exports.app = app
// There is no need for .listen()

Et ensuite traiter toutes les demandes avec l'application suivante :

var vhost = require('vhost');

express()
.use(vhost('m.mysite.com', require('/path/to/m').app))
.use(vhost('sync.mysite.com', require('/path/to/sync').app))
.listen(80)

Notez que /path/to/m et /path/to/sync peuvent être des chemins absolus (comme écrit ci-dessus) ou des chemins relatifs.

1 votes

Cela semble être un moyen beaucoup plus propre et plus clair de réaliser des sous-domaines avec express.

0 votes

Et ensuite, qu'est-ce qui devrait être dans /path/to/m et /path/to/sync ? Une autre application express, comme d'habitude ?

0 votes

Oui, @Costa. Chaque mappage de serveur virtuel doit pointer vers une application express.

23voto

nEEbz Points 7030

Vous pourriez ajouter un sous-domaine à une demande et le vérifier ensuite dans les demandes ultérieures. next() appels.

J'ai obtenu le code suivant de > http://groups.google.com/group/express-js/browse_thread/thread/b04bbaea7f0e8eed (donc crédit complet à l'auteur original)

app.get('*', function(req, res, next){ 
  if(req.headers.host == 'some.sub.domain.com')  //if it's a sub-domain
    req.url = '/mysubdomain' + req.url;  //append some text yourself
  next(); 
});

// This will mean that all get requests that come from the subdomain will get 
// /subdomain appended to them, so then you can have routes like this 
app.get('/blogposts', function(){ 
  // for non-subdomain 
});

app.get('/mysubdomain/blogposts', function(){ 
   // for subdomain 
});

14voto

bmullan91 Points 56

J'ai récemment rencontré ce problème, et j'ai écrit un module pour y remédier en utilisant express 4. https://www.npmjs.org/package/express-subdomain .

Exemple - sous-domaine api.

var express = require('express');
var app = express();

var router = express.Router();

//api specific routes
router.get('/', function(req, res) {
   res.send('Welcome to our API!');
});

router.get('/users', function(req, res) {
    res.json([
        { name: "Brian" }
    ]);
});

app.use(subdomain('api', router));
app.listen(3000);

Consultez le module sur npm pour voir d'autres exemples.

4 votes

Cela semble juste spécifier les routes pour le sous-domaine - comment spécifier à nouveau les routes pour le domaine racine ?

0 votes

J'essaie ce module, mais je ne sais pas comment utiliser un sous-domaine sur le port 80 sans le configurer dans IIS. Je veux garder mon site principal sur 80 mais ajouter un sous-domaine pour mon api express node.

6voto

wilsonpage Points 5495

J'ai créé un module pour aider avec les sous-domaines dans Express : https://github.com/WilsonPage/express-subdomain-handler

0 votes

Bonjour, votre subdomain-handler semble intéressant. Comment pourrais-je l'utiliser avec disons "dev.localhost" ? Que dois-je changer en plus de "baseUrl:localhost", ce n'est pas très clair dans l'exemple que vous avez posté. Merci.

0 votes

Si vous l'utilisez localement, vous devez vous assurer que le sous-domaine que vous utilisez figure dans le fichier "hosts" de votre machine. En production, vous pouvez configurer des sous-domaines joker afin de ne pas avoir à lister tous les sous-domaines dont vous avez besoin. J'utilise généralement le format suivant : subdomain.mysite.dev (localement) et subdomain.mysite.com (en production).

0voto

Faites ce que je dis, créez deux applications express dans des dossiers différents.

Par exemple : une application dans le répertoire /blogsite

const express = require("express");

const blog = express();

blog.get("/", (req, res) => {
    res.send("BLOG SECTION");
});

blog.get("/allblogs", (req, res) => {
    res.json([
        { title: "csgo major boston", description: "Best CSGO major ever" },
        { title: "Blast pro series", description: "Coolest series of CSGO" },
    ]);
});

module.exports = { blog };

et un autre dans le répertoire /portfolio

const express = require("express");

const portfolio = express();

portfolio.get("/", (req, res) => {
    res.send("PORTFOLIO SECTION");
});

portfolio.get("/resume", (req, res) => {
    res.send("HERE'S MY RESUME");
});

module.exports = { portfolio };

Créez maintenant une application principale dans le dossier externe et importez les deux autres applications express que vous venez de créer dans le répertoire /blogsite et le répertoire /portfolio.

Et dans l'application principale, faites ceci,

const express = require("express");
const vhost = require("vhost");

const { blog } = require("./blogsite");
const { portfolio } = require("./portfolio");

const app = express();

// BLOG AND PORTFOLIO

// url: http://blog.localhost:3002/
// url: http://blog.localhost:3002/allblogs

// url: http://portfolio.localhost:3002/
// url: http://portfolio.localhost:3002/resume

app
    .use(vhost("portfolio.localhost", portfolio))
    .use(vhost("blog.localhost", blog));

// MAIN APP ROUTES OR ENDPOINTS

// url: http://localhost:3002
// url: http://localhost:3002/myhobbies

app.get("/", (req, res) => {
    res.send("MAIN APP SECTION");
});

app.get("/myhobbies", (req, res) => {
    res.send("MAIN APP -> myhobbies section");
});

app.listen(3002, () => {
    console.log("started listening");
});

La structure du fichier à la fin devrait ressembler à ceci

main(folder)
  index.js (main express app which you need to run using node or nodemon)
  blogsite(folder that I talked about for blog.localhost)
    index.js (blog express app)
  portfolio(folder)
    index.js (portfolio express app)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X