fragen stichworte

Apache case Insensitive mod_rewrite für eine einzelne Regel

Ich verwende mod_rewrite für suchmaschinenfreundliche URLs. Ich habe diese Zeile, die gut funktioniert:

RewriteRule ^Pay ./pay.php [L] #Pay

, aber ich möchte auch eine Übereinstimmung haben, wenn ein Besucher http://example.com/pay eingibt (beachten Sie die Kleinschreibung). Ich habe versucht, NC zu verwenden, aber ich bekomme einen 500-Fehler. Ich habe versucht, zwei separate Regeln zu erstellen, einen Großbuchstaben und einen Kleinbuchstaben, aber wieder 500 Fehler.

Kann dies mit einem regulären Ausdruck in einer Zeile erfolgen? So etwas wie:

RewriteRule ^([P-p])ay ./pay.php [L] #Pay

Wenn ja, wie ist der richtige Weg? Wenn nicht, wie könnte ich das erreichen, ohne mod_spelling zu benutzen?

antworten

RewriteRule ^Pay ./pay.php [L] #Pay

Sie erhalten einen Fehler von 500 wegen einer endlosen Rewrite-Schleife. Wenn Sie einfach die Groß-/Kleinschreibung nicht beachten, dann wird die umgeschriebene URL, d. /pay.php entspricht dem Groß-/Kleinschreibung-Muster ^Pay usw. usw.

In diesem Fall können Sie einfach Ihr Muster restriktiver machen und nur "pay" anpassen, nicht irgendeinen URL-Pfad, der einfach beginnt "pay". Zum Beispiel:

# Pay
RewriteRule ^pay$ pay.php [NC,L]

Ich habe auch das Präfix ./ in der -Substitution entfernt, dies ist nicht erforderlich. Außerdem unterstützt Apache keine Zeilenende-Kommentare.

Beachten Sie jedoch, dass beim erneuten Umschreiben die Groß- und Kleinschreibung möglicherweise zu Duplicate Content führt.

Ich kenne keine einfache Regel, bei der die Groß-/Kleinschreibung nicht beachtet wird, aber Ihr Versuch, P oder p zu finden, ist sehr nahe an der Korrektur. Lassen Sie einfach den Gedankenstrich und die Klammern weg - es funktioniert. Das habe ich für Sie getestet (so einfach wie möglich):

RewriteRule ^/[Pp]ay/pay.php

Zeichen in eckigen Klammern sind nur Alternativen für ein Zeichen, also

RewriteRule ^[Pp][Aa][yY]/pay.php

würde zu jeder Kombination von Klein- und Großbuchstaben passen. Ich bin mir jedoch nicht sicher, warum Ihre Version nicht funktioniert hat, denn sie bedeutet, dass jedes Zeichen zwischen P und p übereinstimmt. Dies sollte P, Q, R, ... Z, einige Punktu a, b sein , c ... p. Ich habe deine Version nicht getestet.

Die Klammern () sollten keinen Schaden anrichten, sie bedeuten nur "extrahieren Sie das, was Sie dort finden, und machen Sie es als" $ 1 "in der Ersatzzeichenfolge verfügbar".

Vorschlag: Versuchen Sie es mit statischen Dateien. Erstellen Sie test.html mit Dummy-Inhalten (z. B. "this is test.html"), und versuchen Sie, mit Ihrem Browser über den getesteten Webserver darauf zuzugreifen. Fügen Sie dann eine Regel

hinzu
rewriterule ^/best.html$/test.html

und greifen Sie auf best.html zu - Sie sollten test.html sehen. Ändern Sie kleine Teile Ihrer Umschreibungsregel, bis Sie das fehlerhafte Teil gefunden haben.