___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123htaccess ___ Konfigurationsdatei auf Verzeichnisebene, die von Apache-Webservern verwendet wird. Verwenden Sie dieses Tag genau dann, wenn der .htaccess-Inhalt direkt am Thema beteiligt ist. Wir wissen, dass viele Leute .htaccess verwenden, aber bitten Sie die Mitglieder der Community, dieses Tag nicht zu verwenden, es sei denn, Sie wissen, dass es sich um ein Thema in Ihrer Frage handelt. ___ tag123apache ___ Verwenden Sie dieses Tag (zusammen mit einem entsprechenden Programmiersprache-Tag) für die Programmierung von Fragen zum Apache HTTP Server. Verwenden Sie dieses Tag nicht für Fragen zu anderen Apache Foundation-Produkten. Beachten Sie, dass Fragen zur Serverkonfiguration normalerweise besser auf https://serverfault.com passen ___ answer12866665 ___

Zuerst werde ich Ihnen sagen, wie Sie Ihre RewriteRule lesen können:

Sie beginnen mit dem ersten (oder nächsten) RewriteRule-Eintrag:

%code%

Der erste Parameter ist ein regulärer Ausdruck, der der angeforderten URL entsprechen kann. %code% stimmt mit allem überein und speichert dieses "alles" in einer Variablen, die später verwendet werden kann.

Nur wenn vorhergehende RewriteCond-Einträge vorhanden sind, werden sie als nächstes ausgewertet:

%code%

%code% ist ein Verweis auf den Inhalt, der in den ersten Klammern von RewriteRule gefunden wurde. Dies wird mit dem zweiten Parameter verglichen, der ein regulärer Ausdruck ist, der mehrere explizite Namen angibt, und der %code% negiert den Ausdruck, z. Diese Regel erlaubt die Ausführung der RewriteRule nur, wenn die Regex nicht übereinstimmt. Wenn diese Bedingung wahr zurückgibt, wird die nächste Bedingung betrachtet.

%code%

Wenn der angeforderte Dateiname keine echte Datei auf der Festplatte ist, ist diese Bedingung wahr.

%code%

Wenn der angeforderte Dateiname kein echtes Verzeichnis ist, ist diese Bedingung wahr.

Nur wenn alle diese Bedingungen zutreffen (sie sind zusammen mit AND verkettet), kommen wir zurück zur Umschreiberegel:

%code%

Das Ergebnis dieses Umschreibschritts wird als zweiter und dritter Parameter definiert. %code% wird wieder wie für den Inhalt der Übereinstimmung verwendet, und die Parameter definieren, dass diese Regel, wenn sie anfänglich übereinstimmt, die letzte Regel (L) ist und dass jede im Umschreibeziel definierte Abfragezeichenfolge an eine beliebige angehängt wird Abfragezeichenfolge in der ursprünglichen URL (QSA).

Kritik:

Das übliche Umschreiben für MVC-Frameworks versucht, so performant wie möglich zu sein. Ihre Umschreibungsbedingungen müssen alle für eine erfolgreiche Umschreibung ausgewertet werden. Die Option wird nur angehalten, wenn einer der RewriteCond-Werte false zurückgibt. Jede Anforderung, die neu geschrieben wird, unterliegt zahlreichen CPU-intensiven Tests. Zuerst die RewriteRule Regex, dann die Regex in der ersten RewriteCond, gefolgt von zwei Harddisk-Tests auf dem Dateisystem für die Datei Existenz.

Auf der anderen Seite scheint der erste RewriteCond unnötig zu sein. Es prüft auf bestimmte Namen und bricht das Neuschreiben ab. "index.php" sollte vom zweiten RewriteCond erkannt werden, da es sich um eine existierende Datei handelt (wie würde das Umschreiben funktionieren, wenn nicht). Alles, was mit "Ressourcen" beginnt, wird ebenfalls angepasst, aber wahrscheinlich nicht aus den gleichen Gründen: Vorhandene Ressourcen werden vom zweiten RewriteCond gefunden. Zuletzt die Datei "robots.txt". Es ist immer eine gute Idee, eine zu haben, möglicherweise empty, wenn Sie 404 vermeiden möchten, wenn Roboter Ihre Site holen.

Da Sie nichts in der Abfragezeichenfolge ändern, wird die [QSA] -Direktive nicht benötigt.

Verbesserungen:

%Vor%

Die erste RewriteRule stimmt mit dem gesamten angeforderten Pfad überein. Die beiden RewriteCond sind mit [OR] verbunden, sodass der erste RewriteCond, der True zurückgibt, die weitere Auswertung abbricht. Der erste RewriteCond testet, ob die angeforderte Datei existiert. Wenn es existiert, wird true zurückgegeben und die Verarbeitung kehrt zur ersten RewriteRule zurück. Der Zielausdruck ist "-", was "nicht neu schreiben" bedeutet. Der [L] stoppt die weitere Verarbeitung der Umschreibregeln. Am Ende haben wir für eine existierende Datei nur einen Regex- und einen Dateisystemtest, und danach wird diese existierende Datei an den Browser gesendet.

Wenn keine Datei gefunden wurde, werden die erste RewriteRule und RewriteCond nicht ausgelöst, daher wird [L] dort den Prozess nicht stoppen. Also wird die zweite RewriteRule ausgeführt. Dieser ist unconditional, und die Regex ist die gleiche wie zuvor, stimmt mit allem überein und schreibt es in "index.php" um.

Dieses Umschreiben ruft Ihre index.php nicht auf, wenn eine Datei existiert, einschließlich /forum/login.php.

Sie können die zweite in %code% ändern, wenn Sie weiterhin %code% statt %code% analysieren möchten.

    
___ qstntxt ___

Meine Seite leitet aufgrund meiner .htaccess-Datei, die wie folgt eingestellt ist, nicht um:

%Vor%

Ich benutze dieses Setup für mein MVC Framework, also erhalte ich URLs wie %code% , aber wenn ich nach /forum/login.php umadressiere, schneidet es nach / forum /.

Wie kann ich das als Ausnahme hinzufügen, damit ich nach %code%

umleiten kann?

Ich habe eine andere .htaccess in meinem / forum / Verzeichnis gefunden, könnte das auch das Problem verursachen?

%Vor%     
___ answer12865847 ___

Versuchen Sie es mit:

%Vor%

Und das:

%Vor%     
___

8

Meine Seite leitet aufgrund meiner .htaccess-Datei, die wie folgt eingestellt ist, nicht um:

%Vor%

Ich benutze dieses Setup für mein MVC Framework, also erhalte ich URLs wie /controller/method/argument , aber wenn ich nach /forum/login.php umadressiere, schneidet es nach / forum /.

Wie kann ich das als Ausnahme hinzufügen, damit ich nach /forum/login.php

umleiten kann?

Ich habe eine andere .htaccess in meinem / forum / Verzeichnis gefunden, könnte das auch das Problem verursachen?

%Vor%     
Sterling Duchess 12.10.2012, 19:26
quelle

2 Antworten

21

Zuerst werde ich Ihnen sagen, wie Sie Ihre RewriteRule lesen können:

Sie beginnen mit dem ersten (oder nächsten) RewriteRule-Eintrag:

RewriteRule ^(.*)$ index.php/ [L,QSA]

Der erste Parameter ist ein regulärer Ausdruck, der der angeforderten URL entsprechen kann. ^(.*)$ stimmt mit allem überein und speichert dieses "alles" in einer Variablen, die später verwendet werden kann.

Nur wenn vorhergehende RewriteCond-Einträge vorhanden sind, werden sie als nächstes ausgewertet:

RewriteCond !^(index\.php|resources|robots\.txt)

ist ein Verweis auf den Inhalt, der in den ersten Klammern von RewriteRule gefunden wurde. Dies wird mit dem zweiten Parameter verglichen, der ein regulärer Ausdruck ist, der mehrere explizite Namen angibt, und der ! negiert den Ausdruck, z. Diese Regel erlaubt die Ausführung der RewriteRule nur, wenn die Regex nicht übereinstimmt. Wenn diese Bedingung wahr zurückgibt, wird die nächste Bedingung betrachtet.

RewriteCond %{REQUEST_FILENAME} !-f

Wenn der angeforderte Dateiname keine echte Datei auf der Festplatte ist, ist diese Bedingung wahr.

RewriteCond %{REQUEST_FILENAME} !-d

Wenn der angeforderte Dateiname kein echtes Verzeichnis ist, ist diese Bedingung wahr.

Nur wenn alle diese Bedingungen zutreffen (sie sind zusammen mit AND verkettet), kommen wir zurück zur Umschreiberegel:

RewriteRule ^(.*)$ index.php/ [L,QSA]

Das Ergebnis dieses Umschreibschritts wird als zweiter und dritter Parameter definiert. wird wieder wie für den Inhalt der Übereinstimmung verwendet, und die Parameter definieren, dass diese Regel, wenn sie anfänglich übereinstimmt, die letzte Regel (L) ist und dass jede im Umschreibeziel definierte Abfragezeichenfolge an eine beliebige angehängt wird Abfragezeichenfolge in der ursprünglichen URL (QSA).

Kritik:

Das übliche Umschreiben für MVC-Frameworks versucht, so performant wie möglich zu sein. Ihre Umschreibungsbedingungen müssen alle für eine erfolgreiche Umschreibung ausgewertet werden. Die Option wird nur angehalten, wenn einer der RewriteCond-Werte false zurückgibt. Jede Anforderung, die neu geschrieben wird, unterliegt zahlreichen CPU-intensiven Tests. Zuerst die RewriteRule Regex, dann die Regex in der ersten RewriteCond, gefolgt von zwei Harddisk-Tests auf dem Dateisystem für die Datei Existenz.

Auf der anderen Seite scheint der erste RewriteCond unnötig zu sein. Es prüft auf bestimmte Namen und bricht das Neuschreiben ab. "index.php" sollte vom zweiten RewriteCond erkannt werden, da es sich um eine existierende Datei handelt (wie würde das Umschreiben funktionieren, wenn nicht). Alles, was mit "Ressourcen" beginnt, wird ebenfalls angepasst, aber wahrscheinlich nicht aus den gleichen Gründen: Vorhandene Ressourcen werden vom zweiten RewriteCond gefunden. Zuletzt die Datei "robots.txt". Es ist immer eine gute Idee, eine zu haben, möglicherweise empty, wenn Sie 404 vermeiden möchten, wenn Roboter Ihre Site holen.

Da Sie nichts in der Abfragezeichenfolge ändern, wird die [QSA] -Direktive nicht benötigt.

Verbesserungen:

%Vor%

Die erste RewriteRule stimmt mit dem gesamten angeforderten Pfad überein. Die beiden RewriteCond sind mit [OR] verbunden, sodass der erste RewriteCond, der True zurückgibt, die weitere Auswertung abbricht. Der erste RewriteCond testet, ob die angeforderte Datei existiert. Wenn es existiert, wird true zurückgegeben und die Verarbeitung kehrt zur ersten RewriteRule zurück. Der Zielausdruck ist "-", was "nicht neu schreiben" bedeutet. Der [L] stoppt die weitere Verarbeitung der Umschreibregeln. Am Ende haben wir für eine existierende Datei nur einen Regex- und einen Dateisystemtest, und danach wird diese existierende Datei an den Browser gesendet.

Wenn keine Datei gefunden wurde, werden die erste RewriteRule und RewriteCond nicht ausgelöst, daher wird [L] dort den Prozess nicht stoppen. Also wird die zweite RewriteRule ausgeführt. Dieser ist unconditional, und die Regex ist die gleiche wie zuvor, stimmt mit allem überein und schreibt es in "index.php" um.

Dieses Umschreiben ruft Ihre index.php nicht auf, wenn eine Datei existiert, einschließlich /forum/login.php.

Sie können die zweite in RewriteRule ^.*$ index.php/$_SERVER['PATH_INFO'] [L] ändern, wenn Sie weiterhin $_SERVER['REQUEST_URI'] statt %code% analysieren möchten.

    
Sven 12.10.2012, 20:31
quelle
2

Versuchen Sie es mit:

%Vor%

Und das:

%Vor%     
user1386320 12.10.2012 19:30
quelle

Tags und Links