fragen stichworte

Erzwingen von SSL in Apache, ohne den Hostnamen fest zu codieren

Ich denke, denke, dass ich dies sortiert habe (hauptsächlich dank der Frage Wie kann ich nicht-www ohne Hardcoding mit .htaccess umleiten?), aber ich kann es trotzdem nicht Ich verstehe ein paar Dinge völlig.

Ich möchte, dass alle Nicht-SSL-Verbindungen zu meinem Server nach SSL geroutet werden. Ich habe nur einen vhost (und das wird sicher für die Lebensdauer des Servers der Fall sein), aber ich möchte das Festcodieren des Domainnamens vermeiden, teilweise, damit die httpd.conf -Dateien für Staging und Produktion identisch bleiben.

Ich weiß, dass ich Anfragen zur Verwendung von SSL mit einer mod_rewrite -Regel wie

erzwingen kann
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

oder

RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Ich habe jedoch zwei relativ einfache Fragen:

  1. Soll ich aus irgendeinem Grund eine dieser RewriteCond -Anweisungen der anderen vorziehen? Vermutlich, wenn ich die %{SERVER_PORT} -Variable verwende, würden etwaige Verbindungen an Port 8000 weiterhin im Klartext bereitgestellt. Gibt es einen Grund, warum ich es vermeiden sollte, die %{HTTPS} -Variable zu verwenden, die ich übersehe?
  2. Wird diese %{HTTP_HOST} -Variable in der RewriteRule -Anweisung respektiert und automatisch in dem Host: -Header der Anforderung ersetzt? Gibt es einen Umstand, unter dem dies möglicherweise nicht funktioniert?

Falls es einen Unterschied macht, betreiben wir Apache 2 auf RedHat mit mod_ssl und die Site verwendete Drupal 7.

Tut mir leid für eine relativ dumme Frage. Apache sysadmin ist keinesfalls ein Kernbestandteil meines Jobs, also versuche ich mich so gut es geht durcheinander zu bringen. Danke alle!

antworten

Ich habe immer etwas wie das Folgende verwendet:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Weil HTTP gelegentlich über andere Ports als 80 ausgeführt wird. Nun, ich mache das nicht gern, aber manchmal muss es usw. %{HTTPS} ist beispielsweise wahr, wenn SSL über Port 80 verwendet wird.

Ich denke, ich benutze normalerweise

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

%{HTTP_HOST} ist immer das, was vom Client als Host: -Header festgelegt wurde.

Mir fällt jedoch ein, dass es einen anderen Weg gibt, dies zu tun.

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent/https://mysite.example.com/
</VirtualHost>

Sie werden feststellen, dass im obigen Block kein DocumentRoot vorhanden ist. Wenn Sie alles umleiten, benötigen Sie keines.

Wenn Sie nur ein wenig von Ihrer Site zu SSL umleiten möchten, können Sie einfach

tun
Redirect permanent/secure https://mysite.example.com/secure

Ich denke, die Umleitungsoption ist für HTTPS-Forcen auf HTTPS-Basis vorzuziehen, da dies eine Stufe weniger Wahnsinn ist (wie von mod_rewrite so freundlich bereitgestellt).

Es könnte sogar schneller sein, da ein Modul weniger geladen/ausgeführt werden muss.