`
netfork
  • 浏览: 490491 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ror二级域名的猜想和实现

    博客分类:
  • Ruby
阅读更多

搜了一下关于ror二级域名的文章,都是零零散散的,最终也没能找到讨论明白的,下面是自己根据一些讨论提供的线索,猜想了一下实现的方式,可以实现类似javaeye的二级域名效果,但是可能实现的很粗笨很无知,所以请知情者狂拍我,不胜感激。

 

总体划分为两部分进行处理:

1、在routes.rb中,增加对没有controller请求的路由,并在ApplicationController中进行处理。主要解决直接以类似http://netfork.iteye.com访问的情况。

2、在ApplicationController中增加二级域名过滤器。主要解决以类似http://netfork.iteye.com/blog/XXX形式访问的情况。

 

先说第一部分的处理:

1、在routes.rb中增加下面的代码:

map.connect '', :controller => 'application', :action => 'subdomain_dispatch'
 

2、在ApplicationController中增加对应的action。具体参考以下代码示例,取得二级域名,如果非空也非www,则根据此域名取得对应的公司信息。

  # 二级域名路由
  def subdomain_dispatch
    # 取得二级域名
    subdomain_name = request.subdomains.first.to_s
    if !subdomain_name.blank? && subdomain_name != 'www'
      # 根据二级域名,取得对应的公司信息
      @company = Company.find_by_domain_name(subdomain_name)
      if @company
        # 声明布局模板
        render :template => "/company/show", :layout => "company"
      else
        redirect_to :controller => 'index'
      end
    else
      redirect_to :controller => 'index'
    end
  end
 

经过以上两步,直接以http://netfork.iteye.com这种形式请求时,就能自动提取到相应的二级域名信息,并根据二级域名获取到相应的数据。

 

再来说一下第二部分:

第一部分主要解决了http://netfork.iteye.com形式访问,但是,如果想实现http://netfork.iteye.com/blog/xxx形式也能正常路由,且不是redirect形式,就需要借助于ApplicationController的过滤器来实现。

  # 二级域名过滤
  before_filter :subdomain_filter

  # 二级域名过滤器
  def subdomain_filter
    subdomain_name = request.subdomains.first.to_s

    # 判断是否允许使用二级域名进行处理
    if subdomain_name != "www" && ["companies", "news", "msg", "user"].include?(controller_name)
      redirect_to request.url.to_s.sub(subdomain_name, "www")
      return false
    else
      params[:company_name] = subdomain_name
    end
  end

 

 

其实原理就是在过滤器中,将二级域名取出来,然后判断一下,此域名是否允许作为二级域名处理,如果不允许,则直接重定向至www开头的域名中,如果属于二级域名过滤的范围,就将二级域名设到params中,继续向后执行。

比如以下的域名:

http://netfork.hulian56.com/company/about

只需要在company控制器的about这个action中执行如下代码,即可获得netfork对应的about信息。

@company = Company.find_by_domain_name(params[:company_name])

 这样,就解决了以二级域名打头后面带着特定请求的问题了。

 

 

完。

 

分享到:
评论
8 楼 dch1287 2009-07-08  
首先要域名服务商支持泛域名定义吧
7 楼 netfork 2009-07-08  
酷!爽!
我的实现与老大的描述原理上大体相近,javaeye的完整实现思路印证了我的一些猜想,让我对自己实现的这部分代码有了信心。
再次向robbin致谢。
6 楼 robbin 2009-07-08  
  def blog?
    if request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && !RESERVED_DOMAIN.include?(request.subdomains[0])
      @blog_owner ||= User.find_by_domain(request.subdomains[0])
      return !@blog_owner.nil?
    end
    return false
  end
  def group?
    if request.subdomains && request.subdomains[1] && request.subdomains[1].eql?("group") && request.subdomains.length == 2
      @group ||= Group.find_by_domain request.subdomains[0]
      return !@group.nil? && @group.active?
    end
    return false
  end


/blog/xxx 就是标准的Rails路由映射,只不过这种controller需要加一个filter去判断进来的域名,如果不是博客域名访问过来的话就要redirect。
  before_filter :blog_domain_required, :except => [:rss_blog, :show]
  def blog_domain_required
    redirect_to homepage_url and return false unless blog?
  end
5 楼 netfork 2009-07-08  
robbin 写道
二级域名支持是一个很简单的问题,把JavaEye的代码贴出来供你参考:

  # show website homepage
  def homepage
    if www?
      render :template => 'main/homepage', :layout => false
    elsif app?
      if logged_in?
        render :template => 'app/base/index', :layout => 'app'
      else
        redirect_to homepage_url
      end
    elsif job?
      render :template => 'job/homepage', :layout => 'job'
    elsif channel?
      @channel = request.subdomains[0]
      if File.exists?("#{RAILS_ROOT}/app/views/channel/#{@channel}/index.rhtml")
        render :template => "channel/#{@channel}/index", :layout => 'channel'
      else
        render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
      end
    elsif blog?
      @blogs = @blog_owner.blogs_by_page params[:page]
      render :template => 'blog/index/index', :layout => 'blog'
    elsif group?
      Group.increment_counter(:visit_count, @group.id)
      render :template => 'group/index/index', :layout => 'group'
    else
      redirect_to homepage_url
    end
  end


  protected
  def www?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'www'
  end
  
  def job?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'job'
  end

  def app?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'app'
  end
  
  def channel?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && RESERVED_DOMAIN.include?(request.subdomains[0])
  end


判断一下subdomains,根据不同的域名做不同的处理,就这么简单。

谢谢robbin老大的回复。
我的作法也是参考了你n年前的只言片语写的,这回算是有幸见着原装的了。
有一个问题,就是比较关键的 blog? 方法能放上来吗?
还有一个问题,就是如:http://netfork.iteye.com/blog/XXX这样的效果似乎上面的代码并没有给出实现方法吧。
4 楼 robbin 2009-07-08  
二级域名支持是一个很简单的问题,把JavaEye的代码贴出来供你参考:

  # show website homepage
  def homepage
    if www?
      render :template => 'main/homepage', :layout => false
    elsif app?
      if logged_in?
        render :template => 'app/base/index', :layout => 'app'
      else
        redirect_to homepage_url
      end
    elsif job?
      render :template => 'job/homepage', :layout => 'job'
    elsif channel?
      @channel = request.subdomains[0]
      if File.exists?("#{RAILS_ROOT}/app/views/channel/#{@channel}/index.rhtml")
        render :template => "channel/#{@channel}/index", :layout => 'channel'
      else
        render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
      end
    elsif blog?
      @blogs = @blog_owner.blogs_by_page params[:page]
      render :template => 'blog/index/index', :layout => 'blog'
    elsif group?
      Group.increment_counter(:visit_count, @group.id)
      render :template => 'group/index/index', :layout => 'group'
    else
      redirect_to homepage_url
    end
  end


  protected
  def www?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'www'
  end
  
  def job?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'job'
  end

  def app?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'app'
  end
  
  def channel?
    return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && RESERVED_DOMAIN.include?(request.subdomains[0])
  end


判断一下subdomains,根据不同的域名做不同的处理,就这么简单。
3 楼 gokure 2009-07-04  
可以试试plug-in subdomain_fu.
http://github.com/mbleigh/subdomain-fu/tree/master
2 楼 netfork 2009-07-02  
night_stalker 写道
貌似在 httpd 配置比较好?

怎么配呢?
1 楼 night_stalker 2009-07-02  
貌似在 httpd 配置比较好?

搜到这个……
http://hideto.iteye.com/blog/204962

相关推荐

    RoR性能优化经验谈

    RoR(Ruby on Rails)是一种流行的开源Web开发框架,以其高效和简洁的代码著称。然而,随着网站规模的增长,性能优化成为必不可少的环节。在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在...

    ror中文资料

    RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者可以更专注于业务逻辑,而不是底层实现。 在提供的压缩包文件中,我们可以看到"Ruby语言中文教程",这暗示了资源可能包含了关于Ruby语言的基础知识和...

    初探ROR

    2. 函数式编程元素:支持闭包和块,可以实现简洁的代码结构。 3. 强大的元编程能力:Ruby允许在运行时修改类和对象,增强了灵活性。 **二、Rails框架** 1. MVC架构:Rails将应用程序分为模型(Model)、视图(View...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    ror实例

    "ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...

    RoR选题方向—源代码

    在深入研究RoR源代码时,建议先从官方文档和开源项目开始,例如GitHub上的Rails项目,这能帮助你理解框架的设计思路和实现细节。同时,参与开源社区,阅读他人的代码和贡献自己的代码,是提升技能和了解最新实践的好...

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    计算机软件-编程源码-FOXPRO ROR WINDOWS 高级成程序设计技术.zip

    3. **用户界面设计**:在Windows环境下,可能会有窗口、控件、菜单和对话框的设计与交互实现,这些是提升用户友好性的关键。 4. **错误处理和调试**:高级程序设计会包含对异常的捕获和处理,以及调试技巧,帮助...

    神经网络ror resenet模型

    在CIFAR-10上达到89%的准确率,以及在CIFAR-100上达到72%的准确率,展示了ResNet和Ror模型在处理复杂图像分类任务上的强大能力。相比于其他传统的浅层网络或早期的深度网络,这样的准确率显著提高了模型的性能,表明...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    ROR 文件的上传与下载

    为了正确地处理二进制文件,必须在表单中设置`enctype="multipart/form-data"`属性,这是通过在Rails的`start_form_tag`辅助方法中设置`multipart => true`选项来实现的。 ```erb ({:action=>'create'}, {"name"=>...

    敏捷开发第二版ROR必看

    **敏捷开发第二版ROR必看** ...总之,"敏捷开发第二版ROR必看"是一个全面而深入的学习资源,适合所有希望提升自己在Ruby on Rails和敏捷开发方面技能的程序员。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    javarebel 用JAVA和ROR一样方便测试

    破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar

    机遇ROR 的图书管理系统

    8. **会话和cookies**:为了实现用户登录和权限管理,需要理解Rails中的会话和cookie机制,确保用户状态的跟踪。 9. **部署与测试**:最后,学习如何将项目部署到服务器,如Heroku或AWS,并使用RSpec、Capybara等...

    RoR 培训课程PPT

    - **课程性质**:本课程为为期五天的Ruby on Rails(简称RoR)入门级培训,适合初学者快速掌握RoR的基本概念和技术要点。 - **讲师信息**:由Peter Marklund开发并讲解,Peter是一位经验丰富的Ruby on Rails开发者。...

    freemis 基于ror框架的mis

    2. **快速开发**:利用RoR的生产力优势,FreeMIS的开发周期相对较短,能够快速实现功能迭代。 3. **易用性**:RoR的模板引擎和视图层设计使得FreeMIS的用户界面友好,用户体验良好。 4. **社区支持**:RoR拥有庞大的...

    Windows 上搭建 ROR环境

    ### Windows上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...

    ROR环境配置

    总结来说,配置ROR开发环境包括安装Ruby、Rails,创建ROR项目,以及在Eclipse中设置ROR插件和导入项目。在Eclipse中进行ROR开发,可以充分利用其丰富的功能,提升开发效率。理解并熟练运用ROR的MVC架构和相关工具,...

    ROR介绍演讲课件 ruby on rails

    RoR还支持RESTful设计,这是一种基于HTTP协议的Web服务设计风格,可以轻松实现资源的创建、读取、更新和删除操作。TDD(测试驱动开发)也是RoR强调的一个重要方面,它鼓励开发者先写测试,再编写满足测试的代码,...

Global site tag (gtag.js) - Google Analytics