Sven Rautenberg: PHP bei Proxyserver

Beitrag lesen

Moin!

Danke,

das Problem hat irgendwas mit dem Aufruf "$PHP_SELF" zu tun, aber was, weiß ich noch nicht so richtig. Ich bin auf der Suche.

Aha. In $PHP_SELF steht der eigene Skriptname drin.

Da ich aber vermute, dass 1&1 eben einen SSL-Proxy einsetzt, ist diese Angabe im SSL-Kontext falsch.

Der Proxy arbeitet so: Du hast eine Subdomain definiert. Darin befinden sich Seiten. Diese Domain ist per http zugänglich.

Der Besucher ruft diese Seiten aber über den SSL-Proxy ab. Das bedeutet, dass die eigentliche URL (via http) nicht identisch ist mit der Proxy-URL (via https), weil eben dieses Verzeichnis da mit reinkommt. Das bedeutet auch, dass dein Skript absolut nicht wissen kann (vielleicht mit Ausnahme der Tatsache, dass der SSL-Proxy sich irgendwie zu erkennen gibt), dass es über SSL ausgeliefert wird. Es reagiert immer so, als sei es mit HTTP direkt angesprochen worden.

Wenn also z.B. ein Formular an sich selbst geschickt werden soll, wird üblicherweise <form action="<?=$PHP_SELF?>"> verwendet, damit man den echten Skriptnamen nicht hardcoden muß.

In $PHP_SELF steht aber die Domain und der absolute Servername nicht drin, sondern nur der absolute Pfad. Vergleiche mal mit der Ausgabe von phpinfo(INFO_VARIABLES). Also wird das Formular immer an "/absoluterpfad/skript.php" gesenden. Wenn der Browser es von deiner http-Domain erhalten hat, ist das gut. Wenn er es von der SSL-Domain erhalten hat, ist das falsch!

Wie ich schon im ersten Posting vermutete: Es ist eine Pfad-Frage.

Zwei Tipps:

1. Verwende besser _nicht_ $PHP_SELF, sondern die Variante $_SERVER['PHP_SELF']. Es ist damit zu rechnen, dass auch 1&1 irgendwann register_globals auf off schaltet, und dann würde dein Skript nicht mehr funktionieren. Solltest du das Skript auf einen Server packen wollen, auf dem das schon so ist, hast du in jedem Fall verloren.

2. Die Informationen, die in $_SERVER drinstehen, dürften für dich der Schlüssel zum Erfolg sein. Du mußt dort entweder eine Angabe finden, die die originale URL enthält (in der also https....etc drinsteht), oder du mußt eine Angabe finden, die besagt, dass der SSL-Proxy den Request gesendet hat. Im ersten Fall verwendest du diese Angabe anstatt $PHP_SELF, im zweiten Fall kannst du $PHP_SELF durch einen passenden String ergänzen, damit die Angabe wieder stimmt. Beispiel:
Wenn der Request normal reinkommt (HTTP), dann nimm $PHP_SELF. Kommt er vom Proxy, nimm "/intern.xxx-xxx.de".$PHP_SELF als Ziel.

- Sven Rautenberg

--
"Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)