Ich habe eine Rails-App, die über Passenger (mod_rails) bereitgestellt wird und für die ich eine kanonische URL haben möchte.
Ich möchte, dass alle Anfragen anhttp://meinedomain.com(also, umschreibenhttp://www.meinedomain.comZuhttp://meinedomain.com).
Bei meinen anderen Nicht-Rails-Apps erreiche ich dies mit mod_rewrite und einer .htaccess-Datei mit Folgendem:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(.+)mydomain\.com$ [NC]
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]
Dies scheint jedoch mit Passenger nicht zu funktionieren. Ich habe alle möglichen Kombinationen ausprobiert, um die .htaccess-Datei (im öffentlichen Verzeichnis) zu platzieren und die Anweisungen (in der Vhost-Konfiguration) zu verschieben, aber ich bekomme es nicht zum Laufen.
Wie kann ich das erreichen?
Antwort1
Versuchen Sie, die letzte Zeile durch Folgendes zu ersetzen:
Regel neu schreiben ^(.*)http://meinedomain.com%{REQUEST_URI} [R=permanent,QSA,L]
Wenn das immer noch nicht funktioniert, empfehle ich, einen separaten virtuellen Host für die URL www.mydomain.com zu verwenden, der einfach ein Rewrite in mydomain.com durchführt. Passenger funktioniert nicht gut mit mod_rewrite.
Hoffe das hilft.
Antwort2
UPDATE: Anscheinend habe ich eine ältere Version von Passenger verwendet (ich weiß nicht, wie ich das übersehen konnte). Ich verwende derzeit Passenger 2.2.9 und das Einfügen der ursprünglichen Neufassung in den virtuellen Host funktioniert wie erwartet (und gewünscht)!
Google-Gruppendiskussion zu Workarounds für ältere Versionen von Passenger:http://groups.google.com/group/phusion-passenger/browse_thread/thread/5e019e5d65beb54f
Für ältere Versionen:
Hosten Sie es www
als separaten virtuellen Host und leiten Sie es um (Vorschlag von Jonathan Clarke)
RedirectMatch 301 ^(.*)$ http://mydomain.com$1
Führen Sie die Umschreibung in der App durch:
# before_filter :trim_www
def trim_www
if request.subdomains.first == "www"
if request.subdomains == ["www"]
redirect_to "#{request.protocol}#{request.
domain}#{request.port_string}#{request.path}"
else
subdomains = request.subdomains.shift.join(".")
subdomains << "." unless subdomains.blank?
redirect_to
"#{request.protocol}#{subdomains}#{request.domain}#{request.port_string}#{r equest.path}"
end
end
end
(Requisiten an RSL in derursprünglicher Beitragfür diesen Code)