分享 需求都出好了.方案也有了总觉得少一个完美的解决方案

lb563 · 2015年06月26日 · 最后由 liwei78 回复于 2015年06月29日 · 2513 次阅读

需求都出好了.方案也有了总觉得少一个完美的解决方案

突然接到一个需求,然后想了一些处理方案.但是总觉得不够完美.遂发帖求经.写完了我的需求和方案后.我觉得是不是可以在社区中: 把工作中,或者创业中遇到的需求拆分小块.如果遇到觉得不够好的处理方案.然后发到到社区中 (当然你愿意的话) 这样说不一定别人和你遇到同样的问题.最后找到了比较完美的方案 (如果他愿意分享).提问的同学便又获得了新的技能.但是前提是要有自己的解决方案.大学觉得怎么样? 下面是新鲜出炉的需求

需求描述

www.A.com www.B.cn www.C.io www.D.com .... web 实例根据以上的域名来的请求,分别显示不同的数据给客户端.从而达到多域名单实例的结构

运行环境

Apache2 + Rails + Ubuntu

实现方案

  1. 要想以上多个域名都指向同一个 rails 实例,可以实现添加Virtual Host 的方法.但是这样不灵活.每添加或者减少都要重启 apache2

  2. 有没有方法动态的添加或者修改减少域名,但是不用重启 apach2 服务. 有! 我想到可以在 apache.conf 文件中添加 Include /opt/apps/sites_enable 然后在 rails 中实现可以自动添加或者减少域名数据的功能.当添加一个域名时对应生成一个 apache 的Virtual Host的配置文件.放到/opt/apps/sites_enable中,这样 apache 就能动态的读取到配置文件.

我相信你们也许会遇到和我一样的问题.我是这样处理的.不知道你们有没有好的方案可以实现上面的需求呢?

rails 的 request 对象或者在 rack 里就能拿到 host 信息的 写个中间件或者 prepend_before_action 做一些判断加一些后续操作需要的标记就好了

多域名单实例的难点上 session 同步啊

我自己的 cms,也有你类似的需求,一个实例为多个站点服务,每个站点有自己 liquid 制作的界面。

多域名单实例 session 没有考虑,因为是各自独立的企业站点。

# Visit from world
scope module: 'domain', constraints: SiteConstraint.new, default: {formmat: "html"} do
  get '/', controller: :home, action: :index
  get ':action', controller: :home
  get 'catalogs/list_(:id)_(:page)', to: 'catalogs#show'
  get 'catalogs/:id', to: 'catalogs#index'
  get 'articles/:id', to: 'articles#show'
  get 'pages/:id', to: 'pages#show'
  get 'products/:id', to: 'products#show'
end
class SiteConstraint
  def initialize
    $RUNNING_SITES = Site.select(:domain).all_actived.map{|ss| ss.domain }
    puts Time.now.to_s(:db) + "*"*100
    puts "Running sites: #{$RUNNING_SITES.join(', ')}"
  end

  def matches?(request)
    $RUNNING_SITES.include?(request.host)
  end
end
class Domain::BaseController < ApplicationController
  skip_before_filter :authenticate_user!
  before_filter :current_site

  private

  def current_site
    @current_site = Site.where("domain = ? OR system_name = ?", request.host, params[:domain]).first
    if @current_site.nil?
      render text: Settings.site.messages.site_missing, status: 404 and return
    else
      Liquid::Template.file_system = DatabaseTemplate.new(@current_site)
    end
  end
end

为啥不把所有的请求都转给 rails 呢,最省事了。

#3 楼 @hooopo 目前还没有考虑到这个问题.不过我想肯定会遇到.

#1 楼 @jasl #2 楼 @blacktulip #5 楼 @msg7086 需要在请求到达Rails之前就进行域名的判断.因为这个涉及到一个Apache2配置文件的问题. 先有Apache2的配置文件后,才能把 web 的请求转发到Rails.然后Rails再来处理.而在Rails 处理前需要配置多个域名到同一个Rails 实例.

#4 楼 @liwei78 嗯.我也想到用类似的方法来实现.重新整理了一个需求描述. A,B,C 域名需要同时配置到同一个 rails 实例.只要能实现这一点就行

#8 楼 @lb563 我给出的方案就是实现这一点的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号