Wann wird der führende Schrägstrich (/) in mod_rewrite-Mustern benötigt?

10

Hier ist ein Beispiel aus der Apache-Dokumentation zum Erzwingen kanonischer Hostnamen:

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*) http://www.example.com/$1 [L,R,NE]

Was ich gerne wissen würde ist warum das /? wird gebraucht. Ich habe versucht, es zu entfernen, und alles scheint gleich zu funktionieren. Ich hatte den Eindruck, dass der Musterteil der Umschreiberegel mit dem verglichen wurde, was nach dem Schrägstrich kommt.

123
quelle

Antworten:

4

Die Zeichenfolge {REQUEST_URI} beginnt mit einem / -Zeichen. Apache hat die Regex-Engines geändert, als die Versionen geändert wurden. Daher benötigt Apache Version 1 den führenden Schrägstrich, während Apache 2 dies verbietet! Wir können beide Versionen erfüllen, indem wir den führenden Schrägstrich mit dem Ausdruck ^ /? Optional machen. (? ist das Metazeichen für Null oder eines der vorhergehenden Zeichen).

Quelle: http://www.sitepoint.com/apache-mod_rewrite-examples/

Noch ein paar Ressourcen, die über den führenden Schrägstrich sprechen

http://forum.modrewrite.com/viewtopic.php?f=4&t=4627

und http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/

Anagio
quelle
Die Apache 2.2-Dokumentation enthält jedoch mehrere Beispiele mit einem führenden ^ /. ZB hat der Abschnitt RewriteCond : RewriteRule ^/$ /homepage.std.html [L]. Ist das ein Dokumentationsfehler?
Matthew Flaschen
Es stellt sich heraus (wie ich gerade getestet habe), dass das führende / (^ /) zumindest im VirtualHost-Kontext erforderlich ist. Ich habe andere Kontexte nicht getestet.
Matthew Flaschen
8

Ich bin kürzlich selbst auf dieses Problem gestoßen. Es gibt einen Unterschied zwischen der Verwendung RewriteRuleim VirtualHost und als Teil einer .htaccess-Datei. Die folgende Regel stimmt überein (mit einer URL wie dieser example.com/fruit/apple:), wenn sie in einer .htaccess-Datei angezeigt wird:

RewriteRule ^(fruit|fruits)/apple http://newfruitwebsite.com$1 [R=301,L]

wird aber im VirtualHost-Kontext nicht übereinstimmen. Wenn wir uns die Apache-Dokumente ansehen, können wir Folgendes sehen:

Bei Verwendung der Rewrite-Engine in .htaccess-Dateien wird das Verzeichnispräfix automatisch für den RewriteRule-Mustervergleich entfernt und automatisch hinzugefügt, nachdem eine relative Ersetzung (die nicht mit einem Schrägstrich oder einem Protokollnamen beginnt) das Ende eines Regelsatzes erreicht hat.

... aber was bedeutet das? Die obige Regel würde nicht mit derselben URL übereinstimmen, wenn sie in den VirtualHost eingefügt würde, da kein führender Schrägstrich ( /) am Anfang der Zeichenfolge stehen darf. In den Apache-Dokumenten heißt es weiter:

Das entfernte Präfix endet immer mit einem Schrägstrich, was bedeutet, dass der Abgleich mit einer Zeichenfolge erfolgt, die niemals einen führenden Schrägstrich enthält. Daher stimmt ein Muster mit ^ / im Kontext pro Verzeichnis nie überein.

... Wenn wir also einen Schrägstrich für .htaccess und keinen Schrägstrich für VirtualHost benötigen, wie ändern wir das Muster? Du hast es erraten. Wir müssen hinzufügen /?, um die folgende Bedingung in unseren regulären Ausdruck einzufügen (wobei unser Fragezeichen ( ?) der Quantifizierer ist):

  • Hat zwischen 0 und 1 /am Anfang der Zeichenfolge.

Jetzt stimmt unsere URL ( example.com/fruit/apple) - Zeichenfolge überein, da wir die Tatsache behandeln, dass die Regel in der .htaccess-Datei 0Schrägstriche enthält und wenn sie vom virtualHost stammt, 1Schrägstriche enthält.


Verwandte Lektüre:

Henders
quelle