Pergunta

Usando Appspace para implantar um meio de site nenhuma maneira de redirecionamento automatizados 'Morph Labs myapp.com' para 'www.myapp.com' (e não tem acesso a .htacess).

Existe um in-rails maneira de fazer isso? Será que eu preciso de um plugin como subdomínio-fu ?

Mais especificamente, eu estou tentando fazer algo como:

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

Basicamente, eu sempre quero o 'www' subdomínio prepended em cada solicitação (porque o certificado SSL tem especificamente um nome comum de 'www.myapp.com').

Foi útil?

Solução

Talvez algo como isso iria fazer o truque:

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

Outras dicas

A resposta de Carson funciona muito bem.

Aqui está o código para ir para o outro lado (www -> sem 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

Eu tive que mudar a resposta de Carson para começar este trabalho em Rails 3. I substituído request.uri com 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

Isso funcionou muito bem para mim. Eu fiz um pequeno aditamento como eu só queria esse comportamento no meu ambiente de produção:

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

Eu sei que isto é respondida, mas eu pensei que todo mundo deve saber sobre o CodeRack: solução Anfitrião Canonical. Isso é muito bom, pois permite redirecionamentos env específicos. http://coderack.org/users/tylerhunt/middlewares/6-canonical- hospedeiro

Aqui está um par de diferentes maneiras:

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

outro:

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

Para aqueles de vocês que estão olhando para também SSL força usando heroku, isso funcionou bem para mim, com base em Heroku SSL no domínio raiz

Em minhas configurações de DNS para configurar um registro de URL / Avançar (Simple DNS)

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

A configuração CNAME só precisa ser configurado para WWW

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

Eu também tive de configurar e Alias ??para minha raiz

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

Então eu decidi simplesmente substituir foo.com com um ENV['SITE_HOST'] variável env (onde SITE_HOST pode igualar www.foo.com ou test.foo.com) para que eu possa ter o controle via minha configuração heroku . Dessa forma, eu posso controlar o que acontece em diferentes ambientes. (Para criação de variáveis ??env localmente consulte https://github.com/bkeepers/dotenv )

Por exemplo, meu aplicativo de teste usa test.foo.com como o url também tem o seu próprio ponto final SSL para que bem funciona para mim.

  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

A partir de agora, os usuários finais www sempre acesso com SSL forçado. links antigos vão sofrer um pequeno jeito, mas nada perceptível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top