„myapp.com“ in Rails auf „www.myapp.com“ umleiten, ohne htaccess zu verwenden?
-
11-07-2019 - |
Frage
Die Verwendung des Appspace von Morph Labs zum Bereitstellen einer Site bedeutet keine automatische Möglichkeit, „myapp.com“ zu „www.myapp.com“ umzuleiten (und keinen Zugriff auf .htacess).
Gibt es eine In-Rails-Möglichkeit, dies zu tun?Brauche ich ein Plugin wie Subdomain-fu?
Genauer gesagt versuche ich so etwas zu tun:
- 'myapp.com' => 'www.myapp.com'
- 'myapp.com/session/new' => 'www.myapp.com/session/new'
Grundsätzlich möchte ich immer, dass jeder Anfrage die Subdomain „www“ vorangestellt wird (da das SSL-Zertifikat speziell den gebräuchlichen Namen „www.myapp.com“ hat).
Lösung
Vielleicht wie etwas, das würde den Trick tun:
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
Andere Tipps
Carson Antwort funktioniert super.
Hier ist der Code in die andere Richtung zu gehen (www -> kein 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
Ich hatte Carson Antwort zu ändern, dies in Rails zur Arbeit zu kommen 3. Ich request.uri mit request.fullpath ersetzt:
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
Das funktionierte gut für mich. Ich habe eine kleine Ergänzung machen, wie ich dieses Verhalten nur in meiner Produktionsumgebung gesucht:
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
Ich weiß, das beantwortet wird, aber ich dachte, alle anderen über die CodeRack wissen sollten: Canonical Host-Lösung. Das ist wirklich schön, wie es für env spezifische Umleitungen ermöglicht. http://coderack.org/users/tylerhunt/middlewares/6-canonical- Host
Hier ist ein paar verschiedene Möglichkeiten:
head :moved_permanently, :location => ‘http://www.newdomain.com’
eine andere:
def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end
Für diejenigen unter Ihnen, die auch SSL mit Heroku erzwingen möchten: Bei mir hat dies meiner Meinung nach gut funktioniert Heroku SSL auf Root-Domain
In meinen DNS-Einstellungen habe ich einen URL-/Weiterleitungseintrag eingerichtet (DNS Simple)
URL foo.com 3600 http://www.foo.com
Das CNAME-Setup muss nur für WWW eingerichtet werden
CNAME www.foo.com 3600 providedssslendpoint.herokussl.com
Ich musste auch einen Alias für mein Root einrichten
ALIAS foo.com 3600 providedsslendpoint.herokussl.com
Dann habe ich beschlossen, einfach auszutauschen foo.com mit einer env-Variablen ENV['SITE_HOST']
(wobei SITE_HOST www.foo.com oder test.foo.com entsprechen könnte), damit ich die Kontrolle über meine Heroku-Konfiguration haben kann.Auf diese Weise kann ich steuern, was in verschiedenen Umgebungen passiert.(Informationen zum lokalen Einrichten von Umgebungsvariablen finden Sie unter https://github.com/bkeepers/dotenv)
Zum Beispiel verwendet meine Test-App test.foo.com Als URL verfügt es auch über einen eigenen SSL-Endpunkt, sodass das für mich gut funktioniert.
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
Von nun an werden Endbenutzer immer mit erzwungenem SSL auf www zugreifen.Bei alten Links kommt es zu einem leichten Hängenbleiben, aber nichts Auffälliges.