একক অ্যাপ্লিকেশনটিতে একাধিক ডোমেন হ্যান্ডেল করতে রেলগুলি রাউটিং


90

এখানে এবং অন্য কোথাও বেশ কয়েকটি অনুরূপ প্রশ্ন থাকা সত্ত্বেও আমি এই সমস্যার কার্যকর একটি সমাধান খুঁজে পেতে সক্ষম হয়েছি। মনে হচ্ছে সম্ভবত এই প্রশ্নটির উত্তর 3 এর জন্য দেওয়া হয়নি, তাই এখানে যায়:

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা বর্তমানে ব্যবহারকারীদের তাদের নিজস্ব সাবডোমেন তৈরি করতে দেয় যাতে অ্যাপ্লিকেশনটির উদাহরণ রয়েছে। রেল ২-এ থাকাকালীন আপনাকে সাবডোমেন-ফু রত্ন ব্যবহার করে সেরা পরিবেশন করা হয়েছিল, সংস্করণ 3-এ এটি নাটকীয়ভাবে সহজ, রেলকাস্ট অনুসারে - http://railscasts.com/episodes/221-subdomains-in-rails-3

এটি ভাল জিনিস, তবে আমি তাদের অ্যাকাউন্টের সাথে তাদের নিজস্ব ডোমেন নাম যুক্ত করার বিকল্পটিও দিতে চাই। সুতরাং তাদের http://userx.mydomain.com থাকতে পারে , তবে আমি তাদের http://userx.com যুক্ত করার জন্য পছন্দ করতে চাই ।

রেল 2 এ এটি করার জন্য আমি কয়েকটি রেফারেন্স পেয়েছি, তবে সেই কৌশলগুলি আর কাজ করে না বলে মনে হয় (বিশেষত এটি: https://fifighters.com/blog/hosting-m Multipleple-domains-from-a-single-rails -অ্যাপ / )।

কেউ কি কোনও স্বেচ্ছাসেবী ডোমেন গ্রহণ করার জন্য রুটগুলি ব্যবহার করার এবং কোনও নিয়ামকের কাছে দিয়ে দেওয়ার জন্য কোনও উপায়ের পরামর্শ দিতে পারে যাতে আমি উপযুক্ত সামগ্রীটি প্রদর্শন করতে পারি?

আপডেট : আমি এখন বেশিরভাগ উত্তর পেয়েছি, লিওনিদের সময় মতো প্রতিক্রিয়া এবং কোডটিতে একটি নতুন চেহারা fresh শেষ পর্যন্ত এটির জন্য বিদ্যমান সাবডোমেন কোডটি যুক্ত করা দরকার যা আমি ব্যবহার করছিলাম (রেলকাস্ট সমাধান থেকে) এবং তারপরে রুটস.আরবিতে কিছুটা যুক্ত করা হয়েছিল। আমি এখনও সেখানে পুরোপুরি আছি না তবে আমার এখন পর্যন্ত যা আছে তা পোস্ট করতে চাই।

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

আমি প্রথমটির অনুকরণে দ্বিতীয় শ্রেণি যুক্ত করেছি, যা কাজ করে পরিচিত। আমি কেবল একটি শর্ত যুক্ত করি যা নিশ্চিত করে যে আগত ডোমেনটি প্রধান সাইটের হোস্টিংয়ের জন্য নয়।

এই শ্রেণিটি রুটস.আরবিতে ব্যবহৃত হয়:

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

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

এখানে, আমি ডোমেনের জন্য যাচাই করার জন্য বিদ্যমান সাবডোমেন কোডটি (আবার এটি ঠিকঠাক কাজ করছে) প্রেন্ডিং করছি। যদি এই সার্ভারটি সেই ডোমেনটির প্রতিক্রিয়া জানায় এবং মূল সাইটটি পরিচালনা করে এমন এক না হয় তবে নির্দিষ্ট নিয়ন্ত্রকের কাছে ফরোয়ার্ড করুন।

এবং এটি কাজ করছে বলে মনে হচ্ছে, এখনও পুরো জিনিসটি এখনও কাজ করে না, তবে আমি মনে করি এই বিশেষ সমস্যাটি সমাধান হয়ে গেছে।


4
আপনার সম্পাদনার জন্য অনেক ধন্যবাদ, হারুন। আমি এখনই ঠিক একই পরিস্থিতি নিয়ে কাজ করছি। ফলো-আপ প্রশ্ন হিসাবে, আপনি কীভাবে আপনার সার্ভারকে যে কোনও ডোমেইন এতে ফরোয়ার্ড করা হচ্ছে তা গ্রহণ করতে পারেন? আমি ধরে নিলাম এটি .conf ফাইলে একটি সেটিংস হবে তবে আমি কী তা নিশ্চিত নই। কোন সাহায্য প্রশংসা হবে!
মৃত দিকে

হারুন, আমি তোমার সাথে আছি আমি একই জিনিস করতে চাই। তবে আমি ডোমেনটিকে হার্ডকোড করতে চাই না। আমি জোন ফাইল এবং ওয়েব সার্ভার পুনরায় আরম্ভ না করে প্রোগ্রামযুক্তভাবেই এটি সম্পন্ন করতে চাই।
মাইকেল কে ম্যাডিসন

4
মাইকেল, আপনার চারপাশে সমস্যাটি ফ্লিপ করা দরকার। হোস্ট বা সাবডোমেন সীমাবদ্ধতার সাথে আপনার অ্যাপ্লিকেশনটির (যেমন সাইন আপ) একচেটিয়াভাবে রুটগুলি স্পষ্টভাবে ঘোষণা করুন এবং হার্ডকোড করুন, তারপরে আপনার মূল রুটগুলিকে "কোনও ডোমেন বা সাবডোমেন" হিসাবে বিবেচনা করুন। তারপরে বর্তমান ডোমেন বা সাবডোমেনটি অনুসন্ধান করা এবং এটি সঠিক গ্রাহকের কাছে ম্যাপ করা আপনার নিয়ন্ত্রকদের দায়িত্ব।
জাস্টিন ফরাসি 21

উত্তর:


95

এটি http://guides.rubyonrails.org/routing.html#advanced-constraints অনুসারে এটি 3 রেলগুলিতে আসলেই সহজ :

1) এতে একটি কাস্টম সীমাবদ্ধ শ্রেণি সংজ্ঞায়িত করুন lib/domain_constraint.rb:

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

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

২) নতুন ব্লক সিনট্যাক্স সহ আপনার রুটে ক্লাসটি ব্যবহার করুন

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

root :to => 'main#index'

বা পুরানো ফ্যাশন বিকল্প সিনট্যাক্স

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

6
এই উত্তরটি আমার কাছে অনেক সহজ বলে মনে হচ্ছে।
জেরেড

7
এটি একটি দুর্দান্ত সমাধান। এটি একটি উন্নয়নের পরিবেশের সাথে কীভাবে কাজ করে?
সুপারলুমিনিয়ার

4
আপনি যদি উন্নয়নের জন্য স্থানীয় ডোমেন সেট আপ করেন তবে উদাহরণস্বরূপ এটি সম্পূর্ণরূপে সূক্ষ্ম কাজ করে (উদাহরণস্বরূপ /etc/hosts)।
লিওনিড শেভতসভ

7
দ্রষ্টব্য: আপনি যদি স্থানীয়ভাবে পাউ ব্যবহার করেন এবং মাইডোমেন.কম.দেব থাকেন তবে request.domain.কম.দেব ফিরিয়ে দিন। পরিবর্তন request.domainকরুন request.hostএবং এটি পুরোপুরি কাজ করে।
এরিক ময়েসার

4
আমি খুঁজে পেয়েছি যে এটি কাজ করার জন্য আমাকে নামবিহীন রুট তৈরি করতে হবে, অন্যথায় আমি Invalid route name, already in use: 'root'ত্রুটি পেয়েছি ... এটি করার জন্য, আমি রুটটি পরিবর্তিত করেছিroot :to => 'mydomain#index', as: nil
জাস্ট লাকী সত্যই

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.