Reindirizzare "myapp.com" su "www.myapp.com" su rotaie senza utilizzare htaccess?
-
11-07-2019 - |
Domanda
L'uso dello spazio app di Morph Labs per distribuire un sito non significa alcun modo automatizzato per reindirizzare "myapp.com" a "www.myapp.com" (e nessun accesso a .htacess).
Esiste un modo in-rails per farlo? Avrei bisogno di un plug-in come subdomain-fu ?
Più specificamente, sto cercando di fare qualcosa del tipo:
- 'myapp.com' = > 'Www.myapp.com'
- 'myapp.com/session/new' = > 'Www.myapp.com/session/new'
Fondamentalmente, voglio sempre che il sottodominio "www" sia anteposto ad ogni richiesta (perché il certificato SSL ha specificamente un nome comune di "www.myapp.com").
Soluzione
Forse qualcosa del genere farebbe il trucco:
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
Altri suggerimenti
La risposta di Carson funziona alla grande.
Ecco il codice per andare dall'altra parte (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
Ho dovuto cambiare la risposta di Carson per farlo funzionare su Rails 3. Ho sostituito request.uri con 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
Questo ha funzionato alla grande per me. Ho fatto una piccola aggiunta perché volevo solo questo comportamento nel mio ambiente di produzione:
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
So che questa è una risposta, ma ho pensato che tutti gli altri dovrebbero sapere della soluzione CodeRack: Canonical Host. Questo è davvero bello in quanto consente reindirizzamenti specifici per l'ambiente. http://coderack.org/users/tylerhunt/middlewares/6-canonical- ospiterà
Ecco un paio di modi diversi:
head :moved_permanently, :location => ‘http://www.newdomain.com’
un altro:
def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end
Per quelli di voi che stanno cercando di forzare anche SSL usando heroku, questo ha funzionato bene per me, basato su Heroku SSL sul dominio principale
Nelle mie impostazioni DNS ho impostato un record URL / Forward (DNS semplice)
URL foo.com 3600 http://www.foo.com
L'impostazione CNAME deve essere configurata solo per il WWW
CNAME www.foo.com 3600 providedssslendpoint.herokussl.com
Ho anche dovuto installare e Alias ??per il mio root
ALIAS foo.com 3600 providedsslendpoint.herokussl.com
Quindi ho deciso di sostituire semplicemente foo.com con una variabile env ENV ['SITE_HOST']
(dove SITE_HOST potrebbe equivalere a www.foo.com o test.foo .com) così posso avere il controllo tramite la mia configurazione heroku. In questo modo, posso controllare cosa succede in diversi ambienti. (per l'impostazione delle variabili env in locale, vedere https://github.com/bkeepers/dotenv )
Ad esempio, la mia app di test utilizza test.foo.com come url ha anche un proprio endpoint SSL in modo che funzioni bene per me.
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
D'ora in poi, gli utenti finali accederanno sempre a www con SSL forzato. I vecchi collegamenti subiranno un piccolo blocco ma nulla di evidente.