So deaktivieren Sie die .htaccess-Weiterleitung für einen bestimmten Ordner

So deaktivieren Sie die .htaccess-Weiterleitung für einen bestimmten Ordner

Ich schreibe die folgenden .htaccessRegeln, um alle URLs von www.a.comnach 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 RewriteRuleDirektive 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( RewriteCondDirektiven) 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.phpes 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 RedirectDie 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, Redirectunterscheidet sich diese Direktive erheblich von der RewriteRulezuvor verwendeten Direktive und führt zu anderen Ergebnissen. Die RewriteRuleobige DirektiveRückwürfeden angeforderten URL-Pfad und leitet alles an weiter https://www.b.com/myfolder/. Die Redirecthier verwendete DirektiveKonservender angefragte URL-Pfad, mit dem Präfix „wird weitergeleitet zu“ vor dem URL-Pfad /myfolder(z. B. /foo/barwird weitergeleitet zu https://www.b.com/myfolder/foo/bar)

verwandte Informationen