ror 2級ドメイン名の推測と実現


ror 2級ドメイン名に関する文章を探してみると、ばらばらで、最終的には議論が見つからなかった.以下は自分がいくつかの議論によって提供した手がかりに基づいて、実現の方法を推測してみると、javaeyeのような2級ドメイン名の効果を実現することができるが、実現する可能性があるのは不器用で無知なので、知っている人に私を撮ってもらって、感謝に堪えない.
 
全体的に2つの部分に分けて処理します.
1、routes.rbでは,controller要求のないルーティングを増やし,ApplicationControllerで処理する.主な解決は直接類似であるhttp://netfork.iteye.comアクセスの状況.
2、アプリケーションコントローラに二次ドメイン名フィルタを追加する.主な解決は類似であるhttp://netfork.iteye.com/blog/XXX形式アクセスの場合.
 
まず、第1部の処理について説明します.
1、routes.rbに次のコードを追加します.
map.connect '', :controller => 'application', :action => 'subdomain_dispatch'
 
2、アプリケーションコントローラに対応するアクションを追加します.具体的には以下のコード例を参照して、2級ドメイン名を取得し、空でも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
 
以上の2つのステップを経て,直接http://netfork.iteye.comこの形式で要求すると、対応する2級ドメイン名情報を自動的に抽出し、2級ドメイン名に基づいて対応するデータを取得することができる.
 
第2部では
第一部は主に解決したhttp://netfork.iteye.com形式でアクセスしますが、実現したいならhttp://netfork.iteye.com/blog/xxx形式も正常にルーティングでき、redirect形式ではなく、ApplicationControlのフィルタを使用して実現する必要があります.
  #       
  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

 
 
実は原理はフィルタの中で、2級ドメイン名を取り出して、それから判断して、このドメイン名は2級ドメイン名として処理することを許可するかどうか、もし許可しないならば、直接wwwの冒頭のドメイン名の中にリダイレクトして、2級ドメイン名のフィルタリングの範囲に属するならば、2級ドメイン名をparamsの中に設定して、引き続き後へ実行します.
たとえば、次のドメイン名です.
http://netfork.hulian56.com/company/about
companyコントローラのaboutというactionで次のコードを実行するだけで、netforkに対応するabout情報が得られます.
@company = Company.find_by_domain_name(params[:company_name])

これにより,2級ドメイン名の先頭に特定のリクエストが続く問題が解決される.
 
 
終わります.