هل تريد إعادة توجيه "myapp.com" إلى "www.myapp.com" في القضبان دون استخدام htaccess؟

StackOverflow https://stackoverflow.com/questions/327122

سؤال

إن استخدام Appspace الخاص بـ Morph Labs لنشر موقع ما يعني عدم وجود طريقة تلقائية لإعادة توجيه "myapp.com" إلى "www.myapp.com" (وعدم الوصول إلى .htacess).

هل هناك طريقة داخل القضبان للقيام بذلك؟هل سأحتاج إلى البرنامج المساعد مثل المجال الفرعي فو?

وبشكل أكثر تحديدًا، أحاول القيام بشيء مثل:

  • 'myapp.com' => 'www.myapp.com'
  • 'myapp.com/session/new' => 'www.myapp.com/session/new'

في الأساس، أرغب دائمًا في إضافة النطاق الفرعي "www" مسبقًا لكل طلب (لأن شهادة SSL على وجه التحديد لها اسم شائع هو "www.myapp.com").

هل كانت مفيدة؟

المحلول

ربما شيء من هذا القبيل من شأنه أن يفعل الحيلة:

class ApplicationController < ActionController::Base
  before_filter :check_uri

  def check_uri
    redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
  end
end

نصائح أخرى

إجابة كارسون تعمل بشكل رائع.

إليك الرمز للانتقال إلى الاتجاه الآخر (www -> no www)

before_filter :check_uri

def check_uri
  if /^www/.match(request.host)
    redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri 
  end
end

اضطررت إلى تغيير إجابة كارسون حتى يعمل هذا في Rails 3.لقد استبدلت request.uri بـ request.fullpath:

class ApplicationController < ActionController::Base
  protect_from_forgery

  Rails.env.production? do
    before_filter :check_url
  end

  def check_url
    redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
  end
end

هذا عمل عظيم بالنسبة لي.لقد قمت بإضافة صغيرة واحدة لأنني أردت فقط هذا السلوك في بيئة الإنتاج الخاصة بي:

def check_uri
  redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end

أعلم أنه تمت الإجابة على هذا السؤال، لكنني أعتقد أن الجميع يجب أن يعرفوا عن CodeRack:حل المضيف الكنسي.هذا لطيف حقًا لأنه يسمح بعمليات إعادة توجيه محددة للبيئة. http://coderack.org/users/tylerhunt/middlewares/6-canonical-host

إليك طريقتان مختلفتان:

 head :moved_permanently, :location => ‘http://www.newdomain.com’

آخر:

def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end 

بالنسبة لأولئك منكم الذين يتطلعون أيضًا إلى فرض طبقة المقابس الآمنة (SSL) باستخدام Heroku، فقد نجح هذا جيدًا بالنسبة لي، استنادًا إلى Heroku SSL على مجال الجذر

في إعدادات DNS الخاصة بي، قمت بإعداد عنوان URL/سجل إعادة التوجيه (DNS Simple)

URL foo.com     3600        http://www.foo.com

يحتاج إعداد CNAME فقط إلى الإعداد لـ WWW

CNAME   www.foo.com 3600        providedssslendpoint.herokussl.com

واضطررت أيضًا إلى الإعداد والاسم المستعار لجذري

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

ثم قررت أن أستبدل ببساطة foo.com مع متغير env ENV['SITE_HOST'] (حيث قد يساوي SITE_HOST www.foo.com أو test.foo.com) حتى أتمكن من التحكم عبر تكوين Heroku الخاص بي.وبهذه الطريقة، يمكنني التحكم في ما يحدث في بيئات مختلفة.(لإعداد متغيرات env محليًا، راجع https://github.com/bkeepers/dotenv)

على سبيل المثال، يستخدم تطبيق الاختبار الخاص بي test.foo.com باعتباره عنوان URL، فإنه يحتوي أيضًا على نقطة نهاية SSL خاصة به، لذا فهذا يعمل بشكل جيد بالنسبة لي.

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

من الآن فصاعدًا، سيتمكن المستخدمون النهائيون دائمًا من الوصول إلى www باستخدام SSL القسري.سوف تعاني الروابط القديمة من تعليق بسيط ولكن لا يوجد شيء ملحوظ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top