- 浏览: 481381 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
effort0829:
更重要的是可以通过 URL打开特定的资源,然而再windows ...
【转载】自定义URL Protocol 协议 -
追梦人zxy:
mark。我记得cglib代理的话就用set注入
通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理) -
zacry:
这个问题最近也困扰了我很久,我是从一个老项目里迁移代码时遇到的 ...
通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理) -
bo_hai:
netfork 写道哎,大家都回家过中秋节了,自己的问题,自己 ...
Struts 2中验证失败后,radio回复到默认值的问题 -
greatghoul:
看不出有什么严重的,加上 <%- %> 不就可以了 ...
不要在erb中加注释,后果很严重
搜了一下关于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])
这样,就解决了以二级域名打头后面带着特定请求的问题了。
完。
评论
我的实现与老大的描述原理上大体相近,javaeye的完整实现思路印证了我的一些猜想,让我对自己实现的这部分代码有了信心。
再次向robbin致谢。
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
# 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这样的效果似乎上面的代码并没有给出实现方法吧。
# 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,根据不同的域名做不同的处理,就这么简单。
http://github.com/mbleigh/subdomain-fu/tree/master
怎么配呢?
发表评论
-
ruby访问mysql,报mysql_api.so (LoadError)
2010-09-23 22:45 1873转自:http://hi.baidu.com/vincent% ... -
用rails写了一个项目管理系统
2010-08-16 00:40 1741前段去杭州出差,收获 ... -
我好衰,Ubuntu上遇到rails3没法正常启动应用的麻烦
2010-06-07 00:24 1657最近终于迷上了Ubuntu,听Cedric说,ruby1.9+ ... -
在ubuntu下试了一下vim写rails
2010-05-31 00:31 1269果然不错。。。 看了一下时间,一不小心到凌晨了,搞技术就是辛 ... -
Windows下Apache+Mongrel运行不了的问题
2010-01-12 21:43 1082在使用Apache+Mongrel搭配运行时,有时候无法运行, ... -
couldn't load font "宋体 9", falling back to "Sans 9", expect ugly output.
2009-12-20 13:47 2754Windows下使用Ruby-GNOME2写GUI时,会报以下 ... -
Redmine真的是相当好用!!
2009-10-11 17:11 1479rails+java,所向无敌! 力挺Redmine!做的很不 ... -
“Mysql server has gone away” with Rails
2009-09-29 10:22 1641http://stackoverflow.com/questi ... -
不要在erb中加注释,后果很严重
2009-09-27 10:48 3921在erb中加了两行注释,上了Linux生产环境后,生成的htm ... -
Override automatic updated_at in ActiveRecord/Rails
2009-09-27 10:24 1047http://www.neeraj.name/blog/art ... -
改了数据库密码后,一定勿忘!
2009-09-23 21:46 808lighttpd/fastcgi这种配置下,当改了db密码后, ... -
exception_notification那是相当的好用
2009-09-23 15:18 888http://hellosoft.iteye.com/blog ... -
上线前最终定rails版本:2.3.4
2009-09-21 00:04 898呼呼!! -
使用Rails的Cache缓存了站内信
2009-09-15 14:55 1267通过Rails.cache来缓存当前登录用户的站内信条数,当其 ... -
导入cache_fu
2009-09-15 00:39 1049cache优化是长期的工作,今天通过cache_fu优化了一部 ... -
修改will_paginate支持ajax方式
2009-09-13 20:09 0转自http://www.iteye.com/topic/18 ... -
memcached+timed_fragment_cache
2009-09-11 23:48 15001、memcached (1)windows ... -
重启大法
2009-09-06 17:16 964在调试rails时,如果感觉确实没问题,结果死活调不通时,重启 ... -
多态下的counter_cache
2009-09-05 09:22 1128做rails的人是幸福的,因为有时候没必要一定要看专门的api ... -
对于attr_protected字段
2009-09-03 19:23 715update_attribute可以更新,update_att ...
相关推荐
ror实例ror实例ror实例
RoR性能优化经验谈,牛人对ror的优化,值得大家阅读
NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696
ror中文资料ror中文资料
ROR 架构介绍及了解
基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。
神经网络ror resenet模型 cifar10准确率89% cifar100准确率72%
破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar
之前本人在windows 上搭建ROR环境,屡屡受挫,上网查资料、加入ruby on rails的qq群,关注ruby社区等,没有得到一套完整的正确的方法,很多朋友说不要在windows 弄ROR,很费力。的确很费力,后来在朋友的帮助下,...
ROR-ActiveRecord持久层框架的Java实现
RoR选题方向—源代码
家蚕Ror2基因的克隆与表达分析,刘伟,陈菲,Ror家族属于受体酪氨酸激酶中的孤儿受体,在进化上非常保守。本研究克隆了家蚕Ror2基因BmRor2的ORF序列,BmRor2基因的ORF为1924 bp,编码638
ROR环境 Ruby version 1.9.3 (java) RubyGems version 1.8.24 Rack version 1.4 Rails version 3.2.12 JavaScript Runtime therubyrhino (Rhino) Active Record version 3.2.12 Action Pack version 3.2.12 ...
敏捷开发第二版,06年最佳出版物,学习ROR必看教程。。
mysqlDriver4ror.rarmysqlDriver4ror.rarmysqlDriver4ror.rarmysqlDriver4ror.rar
excel lib ror ruby
我自己再开发时的笔记
计算机软件-编程源码-fjvip.zip
研究机构注册(ROR)API ROR API允许检索,搜索和过滤在ROR中建立索引的组织。 结果以JSON返回。 单个组织记录由以下JSON结构表示: { "id":"https://ror.org/013cjyk83", "name":"PSL Research University", "email...
Source.Insight.v3.50.0027-ROR.rar