Redirect 'myapp.com' para 'www.myapp.com' em trilhos sem usar htaccess?
-
11-07-2019 - |
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').
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.