Ich bin kürzlich selbst auf dieses Problem gestoßen. Es gibt einen Unterschied zwischen der Verwendung RewriteRule
im 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 0
Schrägstriche enthält und wenn sie vom virtualHost stammt, 1
Schrägstriche enthält.
Verwandte Lektüre:
RewriteRule ^/$ /homepage.std.html [L]
. Ist das ein Dokumentationsfehler?