express-subdomain icon indicating copy to clipboard operation
express-subdomain copied to clipboard

Multiple levels + NGINX

Open yamila-fraiman opened this issue 7 years ago • 2 comments

I'm trying to configure a multi level subdomain with nginx and express-subdomain. In NGINX I have: upstream backend-project { server unix://home/project/webserver/server.sock; } server { listen 80; server_name admin.project.example.com; location / { proxy_pass http://backend-project; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

And in Node: app.use(subdomain('admin', require('./admin')(db)));

I've tried setting 'subdomain offset' but req.subdomains always returns [] except when I set it to 0 that returns backend-project.

Any idea? Locally using admin.localhost.dev (1 level) this module is working good

yamila-fraiman avatar Nov 19 '17 12:11 yamila-fraiman

You might try something like this:

// app.js
import subdomain from 'express-subdomain'
import express from 'express'

// You're stuff here..

import api from './api'
app.use(subdomain('api', api()))
// api.js
import subdomain from 'express-subdomain'
import express from 'express'
import v1 from './v1'

const api = function() {
  const apiRouter = express.Router()
  apiRouter.use(subdomain('v1', v1()))
  return apiRouter
}
module.exports = api

And

// v1.js
import express from 'express'

const v1 = function() {
  const v1Router = express.Router()
  v1Router.get('/', function(req, res) { res.json({name: 'Brian'}) })

  // You can also use `v1Router.use('/user', user())` to handle different routes

  return v1Router
}

module.exports = v1

This works pretty good for me..

yahiarefaiea avatar Feb 09 '18 05:02 yahiarefaiea

Hi friends i got solution for dynamic domain to work locally:

Use nginx as a server!

If use using apache server, stop that and install nginx

first add all your domains and subdomains in /etc/hosts: (without this you can't able to make work in local system)

127.0.0.1 github.com 127.0.0.1 sameer.github.com

edit your nginx.conf file: Set a nginx reverse proxy

Add your node js project port, in my project i am using 5000, so i put 5000

server {
        listen 80;
        server_name github.com; 
        location / {
            proxy_pass         http://localhost:5000; 
            proxy_http_version 1.1;
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    server {
            listen 80;
            server_name *.github.com;
            location / {
                proxy_pass         http://localhost:5000; 
                proxy_http_version 1.1;
                proxy_set_header Host      $host;
                proxy_set_header X-Real-IP $remote_addr;
            }
        }

Instead of app.use(subdomain('yourstuff', router)); // static way Place the below code:

// get your dynamic subdomain
app.use(function(req, res, next) {
  if (!req.subdomains.length || req.subdomains.slice(-1)[0] === 'www') return next();
  // otherwise we have subdomain here
  var subdomain = req.subdomains.slice(-1)[0];
  // keep it
  req.subdomain = subdomain;
  next();
});


// render a page
app.get('/', function(req, res) {
  // no subdomain
  if (!req.subdomain) {
    // render landing page
    res.render('home');
  } else {
    // render subdomain specific data
    res.render('user-page');
  }
});

msameerbm avatar Jun 21 '18 11:06 msameerbm