هل تريد إعادة توجيه "myapp.com" إلى "www.myapp.com" في القضبان دون استخدام htaccess؟
-
11-07-2019 - |
سؤال
إن استخدام 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 القسري.سوف تعاني الروابط القديمة من تعليق بسيط ولكن لا يوجد شيء ملحوظ.