IT story

단일 애플리케이션에서 여러 도메인을 처리하기위한 Rails 라우팅

hot-time 2020. 9. 14. 21:41
반응형

단일 애플리케이션에서 여러 도메인을 처리하기위한 Rails 라우팅


여기와 다른 곳에서 몇 가지 유사한 질문에도 불구하고이 문제에 대한 실행 가능한 해결책을 찾을 수 없었습니다. Rails 3에서는이 질문에 대한 답변이없는 것 같습니다.

현재 사용자가 애플리케이션의 인스턴스를 포함하는 자체 하위 도메인을 만들 수있는 애플리케이션이 있습니다. Rails 2에서는 subdomain-fu gem을 사용하는 것이 가장 좋았지 만 버전 3에서는 Railscast- http: //railscasts.com/episodes/221-subdomains-in-rails-3에 따라 훨씬 더 간단 합니다.

좋은 점이지만 사용자가 자신의 도메인 이름을 계정과 연결할 수있는 옵션도 제공하고 싶습니다. 따라서 http://userx.mydomain.com 이있을 수 있지만 http://userx.com도 연결 되도록 선택하고 싶습니다 .

Rails 2에서이 작업에 대한 몇 가지 참조를 찾았지만 해당 기술은 더 이상 작동하지 않는 것 같습니다 (특히이 기술 : https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails) -app / ).

누구든지 라우트를 사용하여 임의의 도메인을 수락하고 적절한 콘텐츠를 표시 할 수 있도록 컨트롤러에 전달하는 방법을 추천 할 수 있습니까?

업데이트 : Leonid의 적시 응답과 코드에 대한 새로운 모습 덕분에 대부분의 답변을 얻었습니다. 궁극적으로 Railscast 솔루션에서 사용하던 기존 하위 도메인 코드에 추가 한 다음 routes.rb에 약간 추가해야했습니다. 나는 아직 거기까지 가지 않았지만 지금까지 내가 가진 것을 게시하고 싶습니다.

lib / subdomain.rb에서 :

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end
end

class Domain
  def self.matches?(request)
    request.domain.present? && request.domain != "mydomain.com"
  end
end

나는 일하는 것으로 알려진 첫 번째 클래스를 모방하여 두 번째 클래스를 추가했습니다. 들어오는 도메인이 기본 사이트를 호스팅하는 도메인이 아닌지 확인하는 조건을 추가하기 만하면됩니다.

이 클래스는 route.rb에서 사용됩니다.

require 'subdomain'
constraints(Domain) do
  match '/' => 'blogs#show'
end

constraints(Subdomain) do
  match '/' => 'blogs#show'
end

여기서는 도메인을 확인하기 위해 스탠자를 사용하여 기존 하위 도메인 코드 (다시 정상적으로 작동 함)를 추가하고 있습니다. 이 서버가 해당 도메인에 응답하고 기본 사이트가 작동하는 도메인이 아닌 경우 지정된 컨트롤러로 전달합니다.

작동하는 것처럼 보이지만 아직 모든 것이 작동하지는 않지만이 특정 문제가 해결되었다고 생각합니다.


http://guides.rubyonrails.org/routing.html#advanced-constraints에 따라 Rails 3에서는 실제로 더 간단합니다 .

1) 다음에서 사용자 지정 제약 클래스를 정의합니다 lib/domain_constraint.rb.

class DomainConstraint
  def initialize(domain)
    @domains = [domain].flatten
  end

  def matches?(request)
    @domains.include? request.domain
  end
end

2) 새로운 블록 구문으로 경로에서 클래스 사용

constraints DomainConstraint.new('mydomain.com') do
  root :to => 'mydomain#index'
end

root :to => 'main#index'

또는 구식 옵션 구문

root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')

Rails 5에서는 경로에서 간단히 다음과 같이 할 수 있습니다.

constraints subdomain: 'blogs' do
  match '/' => 'blogs#show'
end

참고URL : https://stackoverflow.com/questions/4207657/rails-routing-to-handle-multiple-domains-on-single-application

반응형