Ich habe einen Ordner, der lediglich eine einzelne HTML-Seite mit dem Inhalt „Demnächst verfügbar“ enthält.
Ich habe dann mehrere Domänen, die ich je nach Bedarf von Zeit zu Zeit auf diesen Ordner verweise.
Einfach, oder?
Nun, was ich möchte, ist eine Bedingung, bei der, wenn die ursprünglich angeforderte Seite kein www war, zu www (301) gewechselt wird, PLUS, wenn es kein https war, zu https (301) gewechselt wird UND dann der gesamte Datenverkehr zu https://www.originating-domain.xzy/index.html
(302) umgeleitet wird.
der Zweck ist, dass dies eine Landingpage für mehrere Zwecke ist, aber IMMER 301 zu https://www
und dann 302 zuindex.html
Bei mir funktioniert die Umstellung von Nicht-www auf www und von http auf https bereits auf jeder Site:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
jetzt möchte ich die temporäre 302-Weiterleitung hinzufügen index.html
.
oder gibt es einfach eine bessere Möglichkeit, dies vollständig zu tun? Da dies sowieso alles vorübergehend ist ... 302 aller Datenverkehr zum Index Ich habe dies versucht, aber es hat nicht funktioniert
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
Antwort1
RewriteCond %{REQUEST_URI} !.*index\.html RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
Dies bringt einige Probleme mit sich ...
Ihnen fehlt anscheinend die
RewriteRule
Muster(erstes Argument) vollständig, daher wird diese Direktive nicht übereinstimmen.Wenn dies übereinstimmt, wird der
www.
Subdomäne ein Präfix vorangestellt.wieder. Ich nehme an, Sie setzen diese Umleitungnachdie kanonischen Weiterleitungen (HTTP zu HTTPS und nicht-www zu www) – wie es sein sollte. Dies würde also zu weiterleitenhttps://www.www.example.com/index.html
, da der Hostname zum Zeitpunkt der Auslösung dieser Weiterleitung bereits kanonisch ist.
DerZustand( RewriteCond
Richtlinie) ist nicht wirklich erforderlich, da diese Prüfung (die /index.html
nicht bereits angefordert wurde) effizienter von der RewriteRule
Richtlinie selbst durchgeführt werden könnte.
Zum Beispiel:
RewriteRule !^index\.html$ /index.html [R=302,L]
Es ist nicht notwendig, das Schema+Hostname in dieAuswechslungZeichenfolge, da Sie ohnehin dorthin umleiten möchten. Wenn Sie es explizit machen möchten, können Sie schreiben https://%{HTTP_HOST}/index.html
.
Beachten Sie, dass in der vorliegenden Form index.html
keine anderenlokalRessourcen (Bilder, CSS, JavaScript usw.), da diese Anfragen ebenfalls umgeleitet werden. Um den Zugriff auf lokale Ressourcen zu ermöglichen, müssen Sie einige Bedingungen hinzufügen, um Anfragen für statische Ressourcen auszuschließen.
RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]
Alternativ können Sie diese Ressourcen auf einer externen Domäne hosten. (Oder in einem Unterverzeichnis und schließen Sie das gesamte Unterverzeichnis aus.)
Wenn ich mich jedoch für eine „Umleitung“ entscheide, würde ich vielleicht auf eine eindeutigere/aussagekräftigere Datei mit einem Namen umleiten, z. B. /coming-soon.html
. Das Problem bei der Verwendung /index.html
ist, wenn Sie später unter dieser URL andere Inhalte bereitstellen möchten und diese zwischengespeichert wurden (aus welchem Grund auch immer). Es /coming-soon.html
sollte jedoch wahrscheinlich „noindex“ sein.
Es kann jedoch vorzuziehen sein, überhaupt nicht umzuleiten und stattdessen einevorübergehendAntwort „503 Service Unavailable“. Siehemeine AntwortWeitere Informationen hierzu finden Sie in der folgenden Frage im Webmaster-Stack:
Beiseite:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
Befinden Sie sich hinter einem Front-End-Proxy, der die SSL-Verbindung verwaltet?
Wenn Sie das sind, ist das in Ordnung, obwohl die zweite Bedingung, die die HTTPS
Servervariable überprüft, dann überflüssig ist. Wenn Sie jedochnichthinter einem SSL-Proxy, dann besteht die Gefahr, dass diese Anweisungen umgangen werden (d. h. der Benutzer wird nicht zu HTTPS umgeleitet), wenn ein X-Forwarded-Proto: https
Header in die Anforderung eingefügt wird.
AKTUALISIEREN:
OK, das funktioniert wie ich will. Aber kann ich sie irgendwie kombinieren?
RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
Wie oben erwähnt, ist die letzte Regel im Wesentlichen identisch mit der folgenden (in Kombination mit den vorhergehenden kanonischen Weiterleitungen), was einfacher und effizienter ist:
RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]
In der zweiten Regel sollten Sie auch ändern dieRewriteRule
Mustervon ^(.*)$
nach ^
(dasselbe wie die erste Regel). ^(.*)$
erfasst unnötigerweise einen Rückverweis und ist weniger effizient.
Sie haben in einem früheren Kommentar (der inzwischen gelöscht wurde) erwähnt, dass Sie möchten, dass dies auch für jede Subdomain funktioniert. Es „funktioniert“ für jede Subdomain, es wird jedoch immer eine zusätzliche www
Subdomain vorangestellt, was wünschenswert sein kann oder nicht? (Es ist nicht üblich, eine www
Sub-Subdomain aufSubdomänen. Ihre Ergebnisse können abweichen.)
Es besteht keine wirkliche Notwendigkeit, diese Regeln zu „kombinieren“. Sie können sie sicherlich nicht kombinieren, wenn Sie eine 301-Weiterleitung zu www+HTTPS durchführen möchten, bevor Sie eine 302-Weiterleitung zur Seite „Coming Soon“ durchführen. Obwohl die ersten beiden Regeln (301-Weiterleitungen) zu einer einzigen Regel „kombiniert“ werden können, hat dies keinen Zweck.
Das einzige kleine Problem hierbei ist, dass es potenziell (höchstens) zwei Weiterleitungen gibt. Erstens eine 301 zu www+HTTPS auf dem ursprünglichen URL-Pfad und eine zweite 302 zur Seite „Coming Soon“.
Ich würde in Frage stellen, ob Sie tatsächlich die anfängliche 301-Umleitung auf www+HTTPS benötigen, wenn Sie den Benutzer sowieso auf einevorübergehend"Coming Soon"-Seite. Sobald Sie die neue Site implementiert haben (und die "Coming Soon"-Seite ersetzt haben), implementieren Sie die kanonische Weiterleitung. Die 302-Weiterleitung kann weiterhin auf www+HTTPS umleiten. (Es gibt jedoch einen Sonderfall, wenn /coming-soon.html
direkt angefordert wird.)
Zum Beispiel:
# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]
# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS
# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Alle Anfragen für http://example.com/foo
werden mit 302 direkt an umgeleitet https://www.example.com/coming-soon.html
.
Falls http://example.com/coming-soon.html
eine solche Anforderung gestellt werden sollte, erfolgt eine 301-Umleitung https://www.example.com/coming-soon.html
(es müssen lediglich HTTPS und die WWW-Subdomäne korrigiert werden).
Es gibt höchstens 1 externe Weiterleitung.
Antwort2
OK, das funktioniert wie ich will. Aber kann ich sie irgendwie kombinieren?
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]