Warum ändert diese RewriteRule QUERY_STRING, aber REQUEST_URI bleibt unverändert?

8

Ich habe eine Kopie von Concrete5, einem PHP-basierten CMS, das auf example.com läuft.

Concrete5 enthält die folgenden grundlegenden Anweisungen für hübsche URLs (leitet alle URLs an eine zentrale index.php weiter)

%Vor%

Ziemlich einfach.

Jetzt habe ich eine bestimmte Menge von URLs, die das Formular

annehmen %Vor%

muss ich an die Concrete5 (virtuelle) URL weiterleiten

%Vor%

Diese URL ist eingerichtet und funktioniert wie erwartet, wenn ich sie manuell im Browser eingebe.

Also habe ich der htaccess -Datei eine Zeile hinzugefügt und sie sieht jetzt so aus:

%Vor%

Ich kann bestätigen, dass RewriteRule ausgelöst wird, wenn ich eine zufällige, externe URL als Umleitungsziel auswähle.

Aber wann immer es eine interne Weiterleitung wie oben ist, was passiert ist, bekomme ich einen 404 in Concrete5. Wenn ich sehe was passiert ist, sehe ich:

%Vor%

So scheint es, dass die Regel ausgelöst wird und etwas umschreibt, aber REQUEST_URI bleibt unverändert!

Warum?

Liegt es daran, dass PHP 7.1 über CGI läuft?

Ich habe eine Zillion Variationen und alle Flaggen in dem Buch ausprobiert, mit wenig Erfolg .

    
Pekka 웃 24.05.2017, 13:48
quelle

3 Antworten

3

Das REQUEST_URI in PHP ist nicht das gleiche wie das REQUEST_URI in mod_rewrite, also kannst du es nicht so machen. In PHP enthält es immer die ursprüngliche URL. Du kannst es also nicht ändern, wenn dein CMS damit arbeitet.

Sie sollten Ihren CMS so einrichten, dass er die gewünschten URLs verwendet, anstatt zu versuchen, die URL-Umschreibung Ihres CMS so zu erweitern.

Wenn Sie REDIRECT_URL in PHP inspizieren, sehen Sie den letzten neu geschriebenen URI.

    
SuperDuperApps 07.06.2017 04:07
quelle
2

REQUEST_URI in PHP wird immer der ursprüngliche Anfrage-URI sein. Weil dies bereits von LSerni und SuperDuperApps erklärt wurde, werde ich nicht näher darauf eingehen. Stattdessen biete ich eine schnelle Lösung an: Modifizieren Sie die REQUEST_URI und fügen Sie einen name -Parameter in PHP statt in .htaccess hinzu.

Fügen Sie dem Anfang Ihrer Concrete5 index.php den folgenden Code hinzu, um sicherzustellen, dass REQUEST_URI geändert wird bevor irgendein Concrete5 Code läuft:

%Vor%     
Rei 08.06.2017 23:05
quelle
1

Ihr Setup funktioniert auf einem PHP 7.1-Rechner (ohne Concrete5). Es ruft ein Skript auf, das ich gerade eingefügt habe und das in /c5.7/products/details steht. Also funktioniert der Apache Teil .

Innerhalb des Skripts sehe ich, dass REQUEST_URI vor dem Umschreiben der alte Wert ist.

Also ist sein Wert normal und es wird nicht umgeschrieben, es ist ein Ablenkungsmanöver - es wird nicht angenommen umgeschrieben zu werden. Der Fehler 404 muss auf etwas anderes zurückzuführen sein.

Ihr Concrete5-Routing sollte die echte URL unterstützen, nicht nur die virtuelle URL, da sich das Routing von C5 auf REQUEST_URI stützt. Wenn dies der Fall ist, müssen Sie eine Route für Ihre kurzen URLs erstellen

%Vor%

und ein geeigneter Controller, um die Parameter abzurufen und den "alten" Controller aufzurufen.

Eine Möglichkeit mit .htaccess könnte dies sein, aber ich bin mir nicht sicher, ob es funktionieren wird, da REQUEST_URI unverändert bleibt:

%Vor%

Andernfalls müssen Sie eine externe Weiterleitung durchführen, die die URL im Browser offenlegt:

%Vor%

Siehe auch diese andere Frage .

    
LSerni 02.06.2017 22:49
quelle