Sven Rautenberg: "403 Forbidden" bei fsockopen() + fputs(GET / HTTP/1.0)

Beitrag lesen

Moin!

vielleicht hätte ich das besser erklären sollen, aber die ich dachte es sei klar, dass die PHP-Erweiterung "Socketfunktionen" nicht zu den Grundfunktionen von PHP zählen, zu denen auch fsockopen() gehört. Die "Socketfunktionen" sind eine Erweiterung von PHP, die beim Compilieren integriert werden kann und mit der man mehr Möglichkeiten in Verbindung mit Sockets hat.

Du meinst http://de.php.net/manual/en/ref.sockets.php? Diese Funktionen helfen dir bei deinem Problem gar nichts.

Die einfachste Möglichkeit ist die Funktion fopen($url, "r");

Wenn man sich aber hinter einer Firewall (Proxyserver) befindet, muss man sich zunächst mit diesem verbinden und über ihn den HTTP-Request absenden.

$fp = fsockopen("tcp://".$proxyhost, $proxyport, &$errno, &$errstr, 30);
   if ($fp)
   {
      fputs($fp, "GET ".$url." HTTP/1.0\n\n");
      while (!feof($fp))
      {
         $reply = fgets($fp, $length_in_byte);
      }
   fclose($fp);
   }

Genau dieses fputs($fp, "GET ".$url." HTTP/1.0\n\n") macht aber bei einigen wenigen Server Probleme, da diese den Request scheinbar als PUT und nicht als GET Request ansehen und darauf mit 403 Forbidden reagieren.

Was steht in $url drin? Welcher Request kommt tatsächlich beim Server an? Welcher Request kommt beim Proxy an?

Wenn du den Proxy kontaktierst und nach einer URL befragst, und du erhälst ein mangelhaftes Ergebnis, dann gibt es dafür nur zwei mögliche Gründe:

1. Du hast den Proxy falsch gefragt.
2. Der Proxy, auf den du keinerlei Einfluß hast, hat den Server falsch gefragt.

Wenn du den Proxy standardgemäß korrekt fragst, dann sollte er seinerseits den Server korrekt fragen und folglich ein ordentliches Ergebnis bringen.

403 forbidden ist jedenfalls Anzeige für alle möglichen Fehler, nicht nur, weil du PUT statt GET verwendet hast. Auch wenn dein Proxy explizit ausgesperrt wurde, würde diese Meldung kommen.

Was mir noch auffällt: Du sendest keine "Host:"-Angabe an den Proxy. Damit kann es passieren, dass der Proxy auch keine an den Server sendet (wenngleich er diese aus der URL-Angabe konstruieren könnte), und VirtualHosts haben dann schon mal so ihre Probleme damit.

In HTTP/1.0 ist "Host" eigentlich nicht vorgesehen, wird aber verwendet, und in HTTP/1.1 ist es zwingend vorgeschrieben.

- Sven Rautenberg

--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)