it-swarm.com.de

RewriteCond, um einen bestimmten URI nicht neu zu schreiben, funktioniert nicht

Ich arbeite mit einem URL-Shortener (YOURLS) und versuche, eine bestimmte Seite nicht an das Linkverarbeitungsskript weiterzuleiten. Hier ist der ursprüngliche .htaccess:

# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
# THE LINE I'M ADDING
# RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$
RewriteRule ^.*$ /yourls-loader.php [L]
</IfModule>
# END YOURLS
RewriteCond %{HTTP_Host} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ "http\:\/\/example\.com\/$1" [R=301,L]

Ich habe eine neue Bedingung direkt vor der RewriteRule -Zeile hinzugefügt (oben auskommentiert und darauf hingewiesen):

RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$

http://example.com/InvalidLink.html ignorieren zu lassen. Das macht aber keinen Unterschied. Was mache ich hier falsch?

2
lfk
# THE LINE I'M ADDING
# RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$

An der Bedingung, die Sie hinzufügen, ist nichts "falsch", vorausgesetzt, die angeforderte URL ist genau /InvalidLink.html (Übereinstimmung mit Groß- und Kleinschreibung), diese .htaccess -Datei befindet sich im Dokumentenstamm und der Browser-Cache wurde geleert vor dem Testen. Das ist also immer noch ein Rätsel. Versuchen Sie, das NC -Flag hinzuzufügen - falls es eine Nichtübereinstimmung gibt, zum Beispiel:

RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$ [NC]

Die Tatsache, dass die Ausnahme "funktioniert", wenn Sie diese Datei zum ersten Mal erstellen. In diesem Fall verhindert die erste Bedingung (!-f), dass das Überschreiben stattfindet schlägt vor, dass die Datei in Ordnung verarbeitet wird und Ihr Cache leer ist. Und dass die obige Bedingung schuld ist. Nach dem, was Sie gepostet haben, sieht es jedoch OK aus !?

Eine Alternative zum Hinzufügen einer Bedingung zu Ihrer vorhandenen Regel besteht darin, eine separate "Ausnahme" oben in Ihrer Datei zu erstellen. Anstatt also zu sagen: "Schreibe die URL um, wenn die Anfrage nicht für /InvalidLink.html ist", können wir eine separate Regel hinzufügen, die besagt: "Wenn die URL /InvalidLink.html ist, dann hör hier auf und mach nichts weiter".

Fügen Sie daher anstelle Ihrer Bedingung eine separate Regel oben in Ihre Datei ein:

RewriteRule ^InvalidLink\.html$ - [NC,L]

Beachten Sie, dass das RewriteRule Muster in verzeichnisbezogenen .htaccess Dateien keinen Schrägstrich enthält. Dies stimmt mit /InvalidLink.html überein und verhindert, dass die folgenden mod_rewrite-Direktiven verarbeitet werden. Im Idealfall sollte das NC -Flag nicht erforderlich sein, ich habe es jedoch "nur für den Fall" eingefügt.


Dies ist wirklich ein Nebeneffekt Ihres obigen Hauptproblems ...

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$

Dieser Karbunkel wird von cPanel automatisch vor jedem RewriteRule hinzugefügt, wenn das SSL-Zertifikat "Let's Encrypt" implementiert wird. Es ist sehr chaotisch und es gibt viele Argumente in den cPanel-Foren Aufforderung, dies zu entfernen oder zu ändern. (Warum sie keinen einzelnen Codeblock/Ausnahme am Anfang der Datei hinzufügen können, ist ein Rätsel.)

In der Zwischenzeit können diese Anweisungen sicher entfernt werden (in der gesamten Datei) - sie sind nicht erforderlich (nachdem das Zertifikat installiert wurde). Dies vereinfacht Ihre Anweisungen und macht die Datei lesbarer (und vermeidet mögliche Konflikte). CPanel fügt diese Anweisungen jedoch später automatisch wieder hinzu, wenn die Zertifikate erneuert werden (alle 3 Monate).

RewriteCond %{HTTP_Host} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ "http\:\/\/example\.com\/$1" [R=301,L]

Wie oben erwähnt, können die mittleren Zustände sicher beseitigt werden. Diese kanonische Weiterleitung befindet sich jedoch am falschen Ort! Es muss ganz oben in Ihrer Datei stehen, sonst wird keine Ihrer verkürzten URLs kanonisiert. Kurz gesagt, cPanel kann die .htaccess -Datei nicht sehr gut (unzuverlässig) bearbeiten!

Zusammenfassung

Alles zusammengenommen kann Ihre vorhandene .htaccess -Datei wie folgt umgeschrieben werden:

RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_Host} ^www\.(.+) [NC]
RewriteRule (.*) http://%1/$1 [R=301,L]

# Exceptions - avoid these URLs being rewritten
RewriteRule ^InvalidLink\.html$ - [NC,L]

# BEGIN YOURLS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /yourls-loader.php [L]
# END YOURLS

Der Wrapper <IfModule> ist nicht erforderlich. Und die RewriteBase Direktive war überflüssig. .* ist dasselbe wie ^.*$. Es ist nicht erforderlich, in der RewriteRule -Ersetzung Zeichen mit einem umgekehrten Schrägstrich zu setzen (das ist "typisches cPanel").

1
MrWhite