Kann ich $ _SERVER ['REDIRECT_URL'] vor der Skriptausführung global festlegen?

8

Ich bin dabei, viele Websites von einer alten auf eine neue Serverkonfiguration zu migrieren. Jede Site basiert auf einer ähnlichen (aber leider nicht identischen) Codebasis unter Verwendung von mod_rewrite-URLs.

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

Meistens funktioniert es wie ein Zauber, aber in der neuen Konfiguration ist $ _SERVER ['REDIRECT_URL'] nicht mehr festgelegt, und der Code schlägt aufgrund einer Abhängigkeit von dieser globalen Variablen fehl.

Soweit ich weiß, wird diese Variable von Apache festgelegt, wenn eine Umleitung erfolgt. Offensichtlich passiert das jetzt nicht, aber ich kämpfe darum, die Ursache zu finden.

  • Ist es das Apache-Upgrade oder (meine Vermutung) der Wechsel von PHP FastCGI zu PHP5-FPM?
  • Wie bekomme ich diese Variable zurück?

Ich würde wirklich lieber nicht den Code auf jeder Site bearbeiten müssen, also werde ich bei Bedarf ein globales PHP auto_prepend festlegen, aber im Idealfall möchte ich die Serverkonfiguration korrigieren und diese zuerst festlegen.

Potenziell verwandt: Ich habe jetzt auch ein paar neue $ _SERVER-Variablen, nämlich REDIRECT_SCRIPT_URL und REDIRECT_REDIRECT_SCRIPT_URL. Diese scheinen die richtigen Daten zu haben, die ich für die REDIRECT_URL haben möchte, scheinen aber auch darauf hinzudeuten, dass zwei interne Weiterleitungen aufgetreten sind, die vorher nicht aufgetreten sind. Die Google-Suche nach REDIRECT_REDIRECT_SCRIPT_URL gibt nur zufällige var_dump-Ausgaben zurück. Ist SCRIPT_URL die neue REDIRECT_URL?

Bearbeiten 1

Erneutes Überprüfen REDIRECT_URL ist (jetzt) ​​festgelegt, jedoch immer auf 'index.php' (das mod_rewrite-Ziel) anstelle der erwarteten eingegebenen URL. Ich habe auf eine Verwendung von PHP auto_prepend_file zurückgegriffen, um die benötigte Variable manuell festzulegen.

Ich bin mir nicht sicher, wie ich es beim ersten Mal verpasst habe, aber ich habe in der Zwischenzeit einige Änderungen vorgenommen, also gibt es wahrscheinlich eine Chance von außen, dass es nicht da war. Entschuldigung, wenn dies jemanden irreführt.

Bearbeiten 2

Um die folgenden Erwähnungen von ErrorDocument zu behandeln, wird folgende mod_rewrite-Regel verwendet:

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

Die Variable $ _GET ['url'] ist festgelegt, daher muss die Regel funktionieren.

Um klar zu sein, habe ich zu diesem Zeitpunkt die ursprünglich erwähnte Problemumgehung für auto_prepend_file verwendet.

Barry
quelle
-1 wegen Nichterfüllung der Sorgfaltspflicht. Eine schnelle Google-Suche ist kein Ersatz für das Lesen der Dokumentation. Bevor Sie Systeme oder Code aktualisieren, sollten Sie sicherstellen, dass Sie verstehen, was sich geändert hat, zumindest was Ihre Systeme oder Projekte betrifft.
John Gardeniers
Entschuldigung für die Unklarheit; Ich las die Dokumentation so gut ich konnte. Dann habe ich auf Google zurückgegriffen, als ich auf etwas stieß, das ich nicht erklären konnte. Die Konfiguration befindet sich auf einem separaten Computer, und beim Testen vor dem Umzug habe ich das oben genannte Problem festgestellt. Ich habe jedoch einen Fehler gefunden, den ich gemacht habe, daher werde ich die Frage aktualisieren.
Barry
Es liegt wirklich in Ihrem und unserem Interesse, wenn Sie uns diese Dinge im Voraus mitteilen. Ich habe meine Stimme umgekehrt.
John Gardeniers
Können Sie uns weitere Informationen zur vorherigen und neuen Serverkonfiguration geben? Die Einstellung von REDIRECT_URL in PHP stammt aus der Umgebungsvariablen SCRIPT_URL in Apache, aber es gibt viele Dinge, die das Verhalten dieses Imports ändern können (z. B. suPHP, Wrapping-Engines, AddTypeHandler-Anweisungen usw.).
Jon Kloske

Antworten:

3

REDIRECT_URL wird nur vom Apache-Webserver und nur unter bestimmten Umständen festgelegt . Es ist wahrscheinlich nicht etwas, worauf sich Ihr Code verlassen sollte. Soweit ich das beurteilen kann, wäre die beste Lösung, den fehlerhaften PHP-Code zu reparieren. Sie können nicht wirklich erzwingen, dass dies immer in Apache eingestellt wird.

Michael Hampton
quelle
Vielen Dank für die Antwort, obwohl ich auf diesem Link leider nichts zu meinem Problem sehen konnte. Ich glaube nicht, dass ein externes ErrorDocument daran beteiligt ist. Ich wünschte, ich könnte den vorhandenen Code ändern, aber das ist derzeit keine Option.
Barry
Der Punkt ist, dass REDIRECT_URL nur während der ErrorDocument-Verarbeitung festgelegt wird. Das bedeutet, dass Ihre PHP-Skripte in der ursprünglichen Konfiguration als ErrorDocuments geladen wurden und jeder, der sie geschrieben hat, sich auf dieses Verhalten verlassen hat. Jetzt, wo es nicht passiert, brechen die Skripte.
Michael Hampton
Es werden keine ErrorDocument-Definitionen verwendet, und ich kann nicht sehen, wie die mod_rewrite RewriteRule (oben hinzugefügt) eine beinhaltet. Ich bin nicht mit Ihnen einverstanden, dass REDIRECT_URL nicht garantiert wird. Ich kann nur keine relevante Dokumentation finden, warum.
Barry
Ich habe oben in meiner Antwort darauf verlinkt. Wenn Sie etwas weiter benötigen, müssen Sie den Apache-Quellcode lesen. Denken Sie jedoch daran, die Antwort zu akzeptieren, mit der Ihr Problem behoben wurde, indem Sie auf den Umriss des Häkchens daneben klicken. Willkommen bei Server Fault.
Michael Hampton
0

Laut PHP-Dokumentation:

$ _SERVER ist ein Array, das Informationen wie Header, Pfade und Skriptpositionen enthält. Die Einträge in diesem Array werden vom Webserver erstellt. Es gibt keine Garantie dafür, dass jeder Webserver diese bereitstellt. Server können einige weglassen oder andere bereitstellen, die hier nicht aufgeführt sind. Allerdings wird eine große Anzahl dieser Variablen in der »CGI / 1.1-Spezifikation berücksichtigt , sodass Sie diese erwarten können sollten.

Es scheint also, dass nicht alle $_SERVERsuperglobalen Variablen so plattformunabhängig sind, wie man es erwarten würde. $_SERVER['REQUEST_URI']scheint ein solcher Wert zu sein, der von allen wichtigen Webservern konsistent definiert wird. Vielleicht möchten Sie ihn stattdessen verwenden.

Garrett
quelle
Vielen Dank dafür, aber mir war bereits bewusst, dass dies manchmal eingestellt ist und manchmal nicht. Was ich mir erhofft hatte, war eine Möglichkeit, aktiv zu beeinflussen, welche Variablen für meine bestimmte Konfiguration festgelegt werden, da ich keine Dokumentation zu Einzelheiten finden kann, die auf meiner Konfiguration basieren (dh wie ich vor einem Umgebungsbuild wissen würde).
Barry
0

Für fehlende Bilder in einem unserer Projekte, die zur index.php umgeleitet wurden, habe ich gerade diesen Fix verwendet:

URL: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Wenn Sie eine globale Lösung wünschen, müssen Sie explode () usw. verwenden und eine andere vorgegebene Variable wie $ _SERVER ['REQUEST_URI'] verwenden.

Fusca Software
quelle
-1

Sie können eine PHP-Auto-Prepend-Datei so einstellen, dass sie einen kleinen Ausschnitt aus PHP-Code enthält, der diese Variable festlegt.

Jon Kloske
quelle
In meiner Frage habe ich dies bereits als die Vorgehensweise identifiziert, die ich ergreifen würde, wenn es nicht möglich wäre. Es war auch das, was ich getan habe, gemäß der Bearbeitung, die ich vorgenommen habe, bevor Sie geantwortet haben.
Barry
Entschuldigung, ich kann mich nicht erinnern, die Bearbeitung gesehen zu haben, bevor ich sie gepostet habe. Möglicherweise habe ich vor der Bearbeitung mit der Beantwortung begonnen, aber ich kann nicht sicher sein, da durch die nachfolgende Bearbeitung der ursprüngliche Bearbeitungsdatenstempel entfernt wurde: / Ich hätte auch klarer machen sollen, dass das, was ich vorgeschlagen habe, wahrscheinlich der richtige Weg ist Erreichen Sie das, wonach Sie suchen, und nicht einen "Fallback". Sie können [E: blah = blah] -Flaggen für die Umschreiberegeln verwenden, um beliebige Umgebungsvariablen festzulegen, die dann in die Pre-Include-Datei abgerufen werden sollen. Dies ist sauberer als die Verwendung von GET-Variablen zum Übergeben von Daten aus der Umleitungs-Engine an Ihren Code.
Jon Kloske
Und mit "wahrscheinlich richtig" meine ich, dass ich genau das in der Vergangenheit an mehreren Stellen getan habe.
Jon Kloske