Rails - Обеспечение www находится в URL - PullRequest
5 голосов
/ 07 декабря 2010

У меня есть приложение, размещенное на Heroku, и у меня есть сертификат для www.mysite.com

Я пытаюсь найти решение для

  • Убедитесь, что в URL есть URLи что URL-адрес HTTPS

Вот что у меня есть до сих пор:

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) if Rails.env == 'production'
  end

Но, похоже, это не работает.Любые предложения или, возможно, другие подходы для обеспечения HTTP и WWW.есть в URL?

Спасибо

Ответы [ 6 ]

12 голосов
/ 07 декабря 2010

Для SSL используйте rack-ssl .

# config/environments/production.rb
MyApp::Application.configure do
  require 'rack/ssl'
  config.middleware.use Rack::SSL
  # the rest of the production config....
end

Для WWW создайте промежуточное программное обеспечение для вашей стойки.

# lib/rack/www.rb
class Rack::Www
  def initialize(app)
    @app = app
  end
  def call(env)
    if env['SERVER_NAME'] =~ /^www\./
      @app.call(env)
    else
      [ 307, { 'Location' => 'https://www.my-domain-name.com/' }, '' ]
    end
  end
end

# config/environments/production.rb
MyApp::Application.configure do
  config.middleware.use Rack::Www
  # the rest of the production config....
end

Чтобы проверить это в браузере, вы можете отредактировать файл /etc/hosts на локальном компьютере разработки

# /etc/hosts
# ...
127.0.0.1 my-domain-name.com
127.0.0.1 www.my-domain-name.com

запустить приложение в производственном режиме на локальном компьютере разработки

$ RAILS_ENV=production rails s -p 80

и перейдите к http://my-domain-name.com/ и посмотрите, что произойдет.

Во время теста вы можете закомментировать строку, перенаправляющую вас на сайт HTTPS.

Возможнотакже есть способы проверить это с помощью стандартных инструментов модульного и интеграционного тестирования, которые используются во многих проектах Rails, таких как Test::Unit и RSpec.

3 голосов
/ 09 декабря 2010

Pivotal Labs имеет некоторое промежуточное программное обеспечение под названием Refraction , которое является заменой mod_rewrite, за исключением того, что оно находится в вашем исходном коде вместо конфигурации Apache.

Это может быть немного излишним для того, что вам нужно, но он справляется с этим довольно легко.

1 голос
/ 08 февраля 2011

In Rails 3

#config/routes.rb
Example::Application.routes.draw do
  redirect_proc = Proc.new { redirect { |params, request|
    URI.parse(request.url).tap { |x| x.host = "www.example.net"; x.scheme = "https" }.to_s
  } }
  constraints(:host => "example.net") do
    match "(*x)" => redirect_proc.call
  end
  constraints(:scheme => "http") do
    match "(*x)" => redirect_proc.call
  end
  # .... 
  # .. more routes ..
  # ....
end
0 голосов
/ 13 декабря 2012

Лучше всего было бы настроить перенаправление с вашим DNS-провайдером, так что это происходит задолго до того, как какой-либо запрос достигает вашего сервера.Из Heroku Dev Center :

перенаправление поддоменов приводит к перенаправлению 301 на указанный поддомен для всех запросов в пустой домен, поэтому все текущие и будущие запросы правильно маршрутизируются иполное имя хоста www отображается в поле местоположения пользователя.

DNSimple обеспечивает удобное перенаправление URL, которое можно увидеть здесь, перенаправляя с голого домена heroku-sslendpoint.com на поддомен www.heroku-sslendpoint.com.enter image description here

Для правильной конфигурации в Heroku поддомен www должен быть ссылкой на запись CNAME на yourappname.herokuapp.com.

Это делает не просто DNSimple.Мой провайдер DNS - 123 Reg , и они поддерживают его, но называют его web forwarding.

0 голосов
/ 13 декабря 2010

Попробуйте это

def check_uri
  if Rails.env == 'production' && request && (request.subdomains.first != "www" || request.protocol != 'https://')
    redirect_to "https://www.mysite.com" + request.path, :status => 301 and return
  end
end
0 голосов
/ 12 декабря 2010

Я думаю, проблема в том, что вы работаете на Heroku. Ознакомьтесь с документацией Heroku, касающейся доменных имен :

"Если вы хотите, чтобы ваше приложение отвечало на любой субдомен под вашим пользовательским доменным именем (как в * .yourdomain.com), вам нужно использовать надстройку с подстановочными доменами. ..."

$ heroku addons:add wildcard_domains

Также посмотрите на Перенаправление трафика на определенный домен :

"Если у вас есть несколько доменов или у вашего приложения есть пользователи, которые обращаются к нему через поддомен Heroku, но позже вы переключились на собственный пользовательский домен, вы, вероятно, захотите перевести всех пользователей в один домен с перенаправлением в ранее фильтр. Что-то вроде этого сделает работу: "

class ApplicationController
  before_filter :ensure_domain

  TheDomain = 'myapp.mydomain.com'

  def ensure_domain
    if request.env['HTTP_HOST'] != TheDomain
      redirect_to TheDomain
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...