Ich schreibe die folgenden .htaccess
Regeln, um alle URLs von www.a.com
nach umzuleiten www.b.com
:
RewriteEngine on
RewriteCond %{http_host} ^www.a.com [NC,OR]
RewriteCond %{http_host} ^a.com [NC]
RewriteRule ^(.*)$ https://www.b.com/myfolder/ [R=301,NC,L]
Jetzt gibt es eine Datei im Unterverzeichnis von a.com
, wie unten:
www.a.com/.well-known/acme-challenge/#######
Es wird für die AutoSSL-Erneuerung verwendet. Mit der obigen Umleitung kann AutoSSL die Datei nicht mehr finden, sodass die Erneuerung fehlschlägt.
Ist es also möglich, die Weiterleitung unter zu deaktivieren /.well-known/acme-challenge/
?
Antwort1
Da Sie alles auf einen festen URL-Pfad umleiten, können Sie die Ausnahme auch direkt in die RewriteRule
Direktive einbauen (es ist nicht erforderlich, den URL-Pfad zu erfassen, wie Sie es derzeit tun).
Zum Beispiel:
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
Das !
Präfix auf derRewriteRule
Musternegiert den Ausdruck, daher ist es erfolgreich, wenn der reguläre AusdrucknichtÜbereinstimmung. In diesem Fall, wenn der angeforderte URL-Pfad nicht beginnt .well-known/acme-challenge/
. (Siehe jedoch den „Sonderfall“ weiter unten.)
Ich habe auch deine beiden kombiniertBedingungen( RewriteCond
Direktiven) in eine. Das Flag für die Regel selbst ist nicht erforderlich NC
(vorausgesetzt, Sie verwenden Linux und nicht Windows).
Denken Sie daran, wörtliche Punkte im regulären Ausdruck mit einem Backslash zu maskieren.
Randfall (optionales Extra)
Beachten Sie, dass Sie, wenn Sie später in der Datei auch ein Front-Controller-Muster haben .htaccess
(z. B. WordPress, Joomla, die meisten anderen Frameworks/CMS usw.), auch einZustandzur obigen Regel, um zu verhindern, dass beim Anfordern einer URL der Form Umschreibungen an den Front-Controller umgeleitet werden /.well-known/acme-challenge/<non-existent-file>
. Beispiel:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
Ohne diese Bedingung würde eine Anforderung http://a.com/.well-known/acme-challenge/<non-existent-file>
andernfalls an weitergeleitet werden https://www.b.com/index.php
(vorausgesetzt, index.php
es handelt sich um den Front-Controller).
Zusammenfassung
Die vollständige Regel würde dann lauten:
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
# Front-controller pattern follows...
AKTUALISIEREN:
wenn die Weiterleitung eine einfache Zeile ist:
redirect 301 / https://www.b.com/myfolder/
, wie schreibt man die Ausnahme für/.well-known/acme-challenge/
?
Seit dereinfach Redirect
Die Direktive (mod_alias) selbst bietet keine Möglichkeit, „Ausnahmen“ zu machen. Sie müssten die Direktive in einen <If>
Ausdruck einschließen (erfordert Apache 2.4). Beispiel:
<If "%{REQUEST_URI} !~ m#^/\.well-known/acme-challenge/#">
Redirect 301 / https://www.b.com/myfolder/
</If>
Referenz:https://httpd.apache.org/docs/2.4/expr.html
Redirect
(Wenn Sie die Direktive so verwenden, gibt es kein „Front-Controller“-Muster und keinen „Edge Case“, wie oben erwähnt.)
Beiseite:Obwohl sie ähnlich aussehen, Redirect
unterscheidet sich diese Direktive erheblich von der RewriteRule
zuvor verwendeten Direktive und führt zu anderen Ergebnissen. Die RewriteRule
obige DirektiveRückwürfeden angeforderten URL-Pfad und leitet alles an weiter https://www.b.com/myfolder/
. Die Redirect
hier verwendete DirektiveKonservender angefragte URL-Pfad, mit dem Präfix „wird weitergeleitet zu“ vor dem URL-Pfad /myfolder
(z. B. /foo/bar
wird weitergeleitet zu https://www.b.com/myfolder/foo/bar
)