PDA

Vollständige Version anzeigen : $_GET - Problem



hevo
13.02.10, 15:10
Hallo Loswebos-Gemeinde!

Folgende Sache: Seit Jahren (genauer 2003) werkelt auf einer Website auf Campari eine Art "Mini-Doit-Yourself-CMS". Nach Außen sieht die Website stinknormal nach HTML aus, im Hintergrund geht aber jeder Aufruf einer HTML-Seite in ein PHP-Script, vorgefertigte Seiten werden von der Festplatte ausgeliefert und es werden sogar die richtigen Statuscodes gesendet bzw. der Inhalt komprimiert, falls ein Browser das möchte.

Wenn ich an einer Seite etwas ändern oder eine neue Seite anlegen will, mache ich das nur in einer "Zwischendatei", die nur den eigentlichen Content dieser Seite enthält. Um die Seiten-Header und Footer, Keywords und die interne Verlinkung, muß ich mich dabei nicht kümmern. Wenn ich meinetwegen an "test.html" bastle und mir eine Vorschau ansehen will, rufe ich die Seite mit

test.html?new=1

auf. Alle anderen sehen die alte Version von der Festplatte. Erst wenn ich die geänderete Seite freigebe, wird sie beim ersten Aufruf generiert und auf der Festplatte gespeichert.

Das Problem ist nun, daß diese ?new=1 Nummer nicht mehr funktioniert!


Ich habe das Skript mal "ausgeschlachtet", damit das Problem deutlich wird. Normalerweise steht die .htaccess Datei bzw. catcher.php natürlich in Doc-Root, hier zum nachmachen (testen) in /html/test/

.htaccess
----------8<----------
Options +SymLinksIfOwnerMatch

php_value register_globals 0

AddHandler CatchHTML html
Action CatchHTML catcher.php

ErrorDocument 404 /test/catcher.php
DirectoryIndex catcher.php
---------->8----------

Wir leiten alle Anfragen eines HTML-Dokuments in diesem Verzeichnis also nach "catcher.php" um - und natürlich auch das ErrorDocument, denn in dem Verzeichnis gibt es ja keine HTML-Dateien. Das Skript kann nun nach herzenslust schalten und walten.

catcher.php
----------8<----------
<?php

function GetCMD() {
if (isset($_GET["new"]))
return true;
return false;
}



/**********************************************
Script - Entry
***********************************************/

header ("Status: 200 OK", true, 200);
header ("Content-Type: text/html");

$IsNew = GetCMD();

?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML>
<HEAD>
<TITLE>Get-Test</TITLE>
</HEAD>
<BODY>
<H1>Willkommen auf...</H1>
<P>... <?php echo $_SERVER["REQUEST_URI"];?>!</P>
<?php
if ($IsNew) {
?>
<P>Get-Variable new ist gesetzt!</P>
<?php
} // end of If IsNew
?>
</BODY></HTML>
---------->8----------

Im Prinzip kann man nun "/test/hans_wurst.html" oder "/test/sonstwas.html" eingeben, man landet immer in diesem Skript. Aber was ist mit der Get-Variablen los, wenn man

/test/hans_wurst.html?new=1
/test/sonstwas.html?new=1

eingibt? Sie ist nicht gesetzt, obwohl sie in $_SERVER["REQUEST_URI"] zu sehen ist...

Meinungen?


bfn hevo

hevo
15.02.10, 11:48
Meinungen?

Offensichtlich keine. Es geht mir doch nicht um den Kinderkram, daß ich die Zeilen

if (isset($_GET["new"]))
return true;

beispielsweise problemlos durch

if (stristr($_SERVER["REQUEST_URI"], '?new=1') !== FALSE)
return true;

ersetzten kann, sondern eigentlich um die Frage, warum die ganze $_GET - Mimik nicht (mehr) funktioniert, wenn der Apache das ErrorDocument aufruft! Das hat doch früher immer funktioniert!

Einfacher Test:

/test/?new=1 funktioniert perfekt, da catcher.php in .htaccess unter DirectoryIndex angegeben ist (und daher direkt aufgefufen wird).

/test/index.html?new=1 funktioniert nicht, da der Server diese HTML-Datei nicht findet und darum das ErrorDocument aufruft.

Irgendetwas stimmt doch hier nicht! Und ich würde auf einen Fehler in PHP tippen, da der Apache ja offensichtlich die komplette URI bei PHP zur Weiterverarbeitung "abgeliefert" hat. Sonst würde sie ja nicht in $_SERVER["REQUEST_URI"] zu sehen sein.

bfn hevo

loswebos.de
15.02.10, 12:03
Auf dem campari gab es, wie per Newsletter mitgeteilt ein Softwareupdate, wobei auch der Apache aktualisiert wurde.

Ich hab folgenden Link gefunden https://www.igotitworking.com/problem/view/41/

Der QueryString steht nach dem Redirect auf das ErrorDocoument unter $_SERVER['REDIRECT_QUERY_STRING'] und nicht mehr unter S_SERVER['QUERY_STRING'];

hevo
15.02.10, 23:08
Hallo Herr Walther!

Ich dachte mir schon, daß Sie sich irgendwann in diesen Thread einschalten... ;)


Auf dem campari gab es, wie per Newsletter mitgeteilt ein Softwareupdate, wobei auch der Apache aktualisiert wurde.

Das mag sein und dieser Newsletter ist wohl an mir vorbeigegangen. In den letzten sieben Jahren hier bei Loswebos hatte ich auch keinen Grund, bei irgendwelchen Newslettern "zusammenzuzucken" und Überstunden einzulegen. Wie Sie oben sehen, ist register_globals = 0 und ich verwende auch brav das superglobale $_GET-Array.

Ich bin bisher nur einmal nach einem Update von PHP auf die Schnauze gefallen:

header ("{$_SERVER["SERVER_PROTOCOL"]} 200 OK");

funktionierte nicht mehr. Da die Header nicht mehr rausgingen, funkte der Apache fröhlich eine 404 - natürlich auch an die Bots. Erst nach vielen, vielen Wochen merkte ich das, denn alle Seiten waren aus dem Google-Index verschwunden! Schön...


Ich hab folgenden Link gefunden https://www.igotitworking.com/problem/view/41/

Der QueryString steht nach dem Redirect auf das ErrorDocoument unter $_SERVER['REDIRECT_QUERY_STRING'] und nicht mehr unter S_SERVER['QUERY_STRING'];

Ist ja lustig. Wenn Sie auf dieser Seite - das ist immerhin die Referenz in Englisch:

http://www.php.net/manual/en/reserved.variables.server.php

die Zeichenkette "REDIRECT_QUERY_STRING" finden, bekommen Sie einen Punkt von mir.

Leider gibts keinen Punkt. Sorry. ;) Aber eigentlich will ich ja auch gar nicht mit dem $_SERVER-Array rumspielen! Denn wozu ist $_GET da? Damit soll ich ja eigentlich Get-Variablen "abholen"! Wenn das Array aber nicht gesetzt ist, dann ist das definitiv ein Bug in PHP, kein Feature!


Wollen Sie mal meine Meinung hören? Ich sag sie Ihnen: PHP ist mittlerweile so aufgeblasen und überladen, daß niemand mehr durchsieht. Es schleichen sich zwangsläufig immer mehr unentdeckte Fehler ein. Es ist nur noch eine Frage der Zeit, bis es zum PHP-Software-GAU kommt.


Liebe Grüße nach L.E.!
hevo