Apache Canonical Rewrite mit Passenger (mod_rails)

Apache Canonical Rewrite mit Passenger (mod_rails)

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 wwwals 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)

verwandte Informationen