2012-01-14 32 views
13

Làm cách nào để cho phép khách hàng truy cập SaaS bằng tên tổ chức của họ trong miền? Ví dụ: một ứng dụng web, example.com, có thể có 2 khách hàng là OrgA và OrbB.Cách tạo tên miền phụ kiểu khách hàng/khách hàng bằng cách sử dụng Node và Express

Sau khi đăng nhập, mỗi khách hàng được chuyển hướng đến trang web của họ, orga.example.com/orgb.example.com.

Khi yêu cầu bao gồm tên miền phụ đến máy chủ nút, hy vọng của tôi là xử lý yêu cầu bằng một tuyến '/'. Bên trong trình xử lý tuyến đường, nó chỉ đơn giản là kiểm tra tiêu đề máy chủ và xử lý tên miền phụ dưới dạng tham số cho tổ chức. Một cái gì đó như:

app.get "/*", app.restricted, (req, res) -> 
    console.log "/* hit with #{req.url} from #{req.headers.host}" 
    domains = req.headers.host.split "." 
    if domains 
    org = domains[0] 
    console.log org 
    # TODO. do something with the org name (e.g. load specific org preferences) 
    res.render "app/index", { layout: "app/app" } 

NB. Mục đầu tiên trong mảng tên miền là tên tổ chức. Tôi giả định rằng không có cổng nào xuất hiện trong tiêu đề máy chủ và, hiện tại, tôi không xem xét cách xử lý tên miền phụ không tổ chức (ví dụ: www, blog, v.v.).

Câu hỏi do đó tôi có nhiều hơn về cách nút/Express có thể được định cấu hình để xử lý các yêu cầu với các tiêu đề máy chủ khác nhau. Điều này thường được giải quyết trong Apache bằng cách sử dụng một bí danh ký tự đại diện hoặc trong IIS bằng cách sử dụng một tiêu đề máy chủ.

Một Apache/Rails ví dụ là @http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

Làm thế nào cùng có thể đạt được trong nút?

+0

Bạn có thể viết một middleware mà nhìn vào các tiêu đề sở tại, được bất kỳ dữ liệu nó cần cho máy chủ cụ thể đó và thêm vào đối tượng req để sử dụng trong các tuyến đường/phần mềm trung gian. –

+0

Tôi nghĩ rằng bit là những gì tôi đã có (mặc dù chưa được chuyển đến middleware). Tôi bị chặn/không rõ ràng về cách thiết lập máy chủ để bắt * .example.com. Tôi nghĩ rằng một proxy có thể được yêu cầu (https://github.com/nodejitsu/node-http-proxy) nhưng tôi cần phải tìm hiểu thêm trước khi tôi cố gắng hiểu nó. Tôi cũng cần giải pháp để tôi phát triển cục bộ (trên OSX). – mattgi

Trả lời

2

Tôi nghĩ rằng mọi yêu cầu đến địa chỉ IP và cổng của máy chủ nút của bạn sẽ được máy chủ nút xử lý. Đó là lý do tại sao bạn làm cho vhosts trong apache, để phân biệt giữa các yêu cầu apache nhận bởi ví dụ tên miền phụ.

Hãy xem mã nguồn cho express-subdomains nếu bạn muốn xem cách xử lý tên miền phụ (the source chỉ có 41 dòng).

1

Tôi có tình huống tương tự, mặc dù tôi có trang web example.com chính nơi người dùng có thể đăng nhập và quản lý trang web của họ, sau đó OrgA.example.com là trang web công khai sẽ được cập nhật dựa trên người dùng đã đăng nhập hành động tại example.com.

Tôi đã kết thúc việc tạo hai ứng dụng riêng biệt và thiết lập máy chủ ảo trong kết nối để trỏ 'example.com' sang một ứng dụng và '*' sang một ứng dụng khác. Here's an example về cách thực hiện.

7

nếu bạn không muốn sử dụng express.vhost, bạn có thể sử dụng http-proxy để đạt được một hệ thống định tuyến/cổng có tổ chức hơn

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

/* 
Because of the way nodejitsu deals with ports, you have to put 
your proxy first, otherwise the first created webserver with an 
accessible port will be picked as the default. 

As long as the port numbers here correspond with the listening 
servers below, you should be good to go. 
*/ 

var proxyopts = { 
    router: { 
    // dev 
    'one.localhost': '127.0.0.1:3000', 
    'two.localhost': '127.0.0.1:5000', 
    // production 
    'one.domain.in': '127.0.0.1:3000', 
    'two.domain.in': '127.0.0.1:4000', 

    } 
} 

var proxy = require('http-proxy') 
    .createServer(proxyopts) // out port 
    // port 4000 becomes the only 'entry point' for the other apps on different ports 
    .listen(4000); // in port 


var one = express() 
    .get('/', function(req, res) { 
    var hostport = req.headers.host 
    res.end(hostport) 
}) 
.listen(3000) 


var two = express() 
    .get('/', function(req, res) { 
    res.end('I AM APP FIVE THOUSAND') 
    }) 
    .listen(5000) 
Các vấn đề liên quan