Mehrere bedingte Weiterleitungen, alle in einer einzigen .htaccess (Landing Page)

Mehrere bedingte Weiterleitungen, alle in einer einzigen .htaccess (Landing Page)

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 ...

  1. Ihnen fehlt anscheinend dieRewriteRule Muster(erstes Argument) vollständig, daher wird diese Direktive nicht übereinstimmen.

  2. 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 weiterleiten https://www.www.example.com/index.html, da der Hostname zum Zeitpunkt der Auslösung dieser Weiterleitung bereits kanonisch ist.

DerZustand( RewriteCondRichtlinie) ist nicht wirklich erforderlich, da diese Prüfung (die /index.htmlnicht bereits angefordert wurde) effizienter von der RewriteRuleRichtlinie 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.htmlkeine 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.htmlist, wenn Sie später unter dieser URL andere Inhalte bereitstellen möchten und diese zwischengespeichert wurden (aus welchem ​​Grund auch immer). Es /coming-soon.htmlsollte 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 HTTPSServervariable ü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: httpsHeader 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 wwwSubdomain vorangestellt, was wünschenswert sein kann oder nicht? (Es ist nicht üblich, eine wwwSub-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.htmldirekt 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/foowerden mit 302 direkt an umgeleitet https://www.example.com/coming-soon.html.

Falls http://example.com/coming-soon.htmleine 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]

verwandte Informationen