htaccess-Datei, um bestimmte Regeln für verschiedene Domänen auszuführen

htaccess-Datei, um bestimmte Regeln für verschiedene Domänen auszuführen

Ich habe eine Anwendung mit einem Server über mehrere Domänen (jede passt das Erscheinungsbild der Anwendung an).

Darüber hinaus gibt es eine gemeinsame Domäne mit mehreren Subdomänen, um dieselben Daten wie oben anzuzeigen.

Also - www.apples.comsieht genauso aus wieapples.efruit.co.uk

und - www.bananas.co.uksieht genauso aus wiebananas.efruit.co.uk

usw

Jetzt habe ich ein Wildcard-SSL für die Domäne efruit.co.uk, deshalb möchte ich die htaccess-Datei verwenden, um alle Anfragen von efruit.co.uk zur Verwendung von https zu zwingen (falls dies nicht bereits geschieht).

Alle anderen Domänen verfügen nicht über ein SSL und müssen daher HTTP verwenden, um Browserwarnungen zu vermeiden – wiederum aus der htaccess-Datei.

Ich möchte auch die htaccess-Datei verwenden, sodass, wenn jemand www.apples.efruit.co.uk eingibt, es als apples.efruit.co.uk umgeschrieben wird (über https wie oben). Allerdings ist www. in Ordnung, wenn es sich nicht um eine efruit.co.uk-Domäne handelt.

Schließlich habe ich dann die standardmäßige und gut dokumentierte Umschreibregel für Codeigniter, um die URL schöner zu gestalten.

Hier ist, was ich bisher habe.

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]

# block hidden directories
RewriteRule "(^|/)\." - [F]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

Das einzige, was zu funktionieren scheint, ist die erzwungene Bereitstellung von efruit.co.uk-Domänen über https.

Antwort1

Sie scheinen sich hinter einem SSL-Proxy(?) zu befinden, daher die Verwendung des X-Forwarded-ProtoAnforderungsheaders anstelle der HTTPSServervariable.

RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Obwohl Sie angeben, dass dieser Teil „funktioniert“ („erzwingt efruit.co.ukdie Bereitstellung von Domänen über https“), wird dadurch die Hauptdomäne nicht umgeleitet und die www-Subdomäne wird beibehalten, falls sie in der Anfrage vorhanden ist. Sie sollten diese zuerst entfernen, um eine sekundäre Umleitung zu vermeiden. Daher ist eine Änderung der Reihenfolge dieser Anweisungen erforderlich.

Sie benötigen außerdem keine Erfassungsgruppe (d. h. ein eingeklammertes Untermuster), es sei denn, Sie beabsichtigen, dies als Rückreferenz zu verwenden – was jedoch nicht der Fall zu sein scheint.

Alle anderen Domänen verfügen nicht über ein SSL und müssen daher HTTP verwenden, um Browserwarnungen zu vermeiden – wiederum aus der htaccess-Datei.

Sie können keine Umleitung von HTTPS zu HTTP durchführen, .htaccessum die Browserwarnung auf diesen anderen Domänen zu vermeiden – was Sie anscheinend vorschlagen. Weil das ungültige SSL-ZertifikatBrowserwarnungtritt einVor .htaccessausgeführt. Der SSL-Handshake erfolgt ganz am Anfang der Anfrage.

RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Daher wird das Obige nicht tatsächlich von einem Browser ausgeführt, es sei denn, der Benutzer akzeptiert die SSL-Zertifikatswarnung (was er nicht tun sollte).

RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]

Dies .htaccesswürde zu einer ungültigen Umleitung führen, für alles außer dem Dokumentstamm, da die $1Rückverweis keinen Schrägstrich als Präfix hat. Selbst für den Dokumentstamm sollten Sie wirklich einen abschließenden Schrägstrich amAuswechslung(obwohl der Browser dies implizit behebt). Außerdem frage ich mich, warum Sie REQUEST_URIin den ersten beiden Regeln die Servervariable verwendet haben, hier aber eine Rückreferenz verwendet haben?

Versuchen Sie stattdessen etwas wie das Folgende:

# Prevent any fruther processing when requesting "health_check.php"
# CHECK: Absence of start of string anchor?
RewriteRule health_check\.php$ - [L]

# Remove www sub-subdomain (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC]
RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L]

# HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# HTTPS to HTTP redirect for none "efruit.co.uk" domains
# Note that the user will still have to click through any browser security warnings
RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Weitere Hinweise:

  • Bei Verwendung innerhalb einer Zeichenklasse ist es nicht erforderlich, einen wörtlichen Punkt mit einem Backslash zu maskieren.
  • Ich habe den $Anker am Ende der Zeichenfolge bei der Hostprüfung entfernt, um FQDNs abzufangen, die einen abschließenden Punkt enthalten.
  • Sie möchten diese permanenten (301) Weiterleitungen wahrscheinlich ändern, nachdem Sie bestätigt haben, dass sie ordnungsgemäß funktionieren. Ändern Sie sie z. B. in R.R=301

verwandte Informationen