PHP als HTTP-Client (gibt User-Agent und Referer nicht weiter)

Neurodeamon

Erfahrenes Mitglied
Mit folgendem Script möchte ich eine bestimmte Seite alle paar Stunden per Cronjob nach einem Schlagwort durchsuchen. Das ist aber nicht das Problem ;-)
Das Script funktioniert.
Mein Problem ist viel eher das bei betreffenden Aufrufen kein User-Agent und Referer geloggt werden. Tja, ich grüble schon seit zwei Stunden über dem Problem. Meine beiden Strings scheinen aber korrekt zu sein.

Was übersehe ich? Oder liegt es an meinem PHP?
Meine Nerven liegen blank und die Konzentration will nach 20 Tassen Kaffe nicht mehr. :-)

PHP:
<?php
$url = "http://www.website.de/index.php";

$verbindung = fopen ($url, "r");
if (!$verbindung) {
    echo "<p>Unable to open remote file.\n";
    exit;
}

fputs($verbindung, "GET HTTP/1.1\r\n");
fputs($verbindung, "Host: www.website.de\r\n");
fputs($verbindung, "User-Agent: Mozilla/4.0 Compatible\r\n");
fputs($verbindung, "Referer: http://www.nothinghere.com\r\n");
fputs($verbindung, "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
fputs($verbindung, "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n");
fputs($verbindung, "Accept-Encoding: gzip,deflate\r\n");
fputs($verbindung, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n");
fputs($verbindung, "Keep-Alive: 300\r\n");
fputs($verbindung, "Connection: close\r\n\r\n");

while (!feof ($verbindung)) {
    $inhalt .= fgets ($verbindung, 1024);
}
fclose($verbindung);

echo $inhalt;

?>
 
Hi Neuro,

aender mal
PHP:
fputs($verbindung, "GET HTTP/1.1\r\n");
in
PHP:
fputs($verbindung,"GET / HTTP/1.1\r\n");

Und trink nicht so viel Kaffee, das ist nicht gesund.

Nachtrag: Ich hab Deinen String grad mal per Telnet getestet und folgendes erhalten:
Telnet hat gesagt.:
GET HTTP/1.1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
Connection closed by foreign host.
 
Hmm, bei mir funktionieren beide Versionen und geben Statusmeldung 200 zurück. :confused:

Würe mich auch wundern, wenn PHP plötzlich mit dem Leerzeichen an der Stelle pingelig umgeht.
 
Ich denke eher, dass der Webserver da so pingelig ist, denn / gibt ja den Pfad fuer die Aktion GET an.
Aber merkwuerdig, dass es bei Dir auch ohne / geht.
Mit welchem Web-Server testest Du?

Uebrigens, ich hab auch eine Klasse fuer solche Spielereien. Der Vorteil: Die Antwort wird gleich mundgerecht aufbereitet.
 
Ich muss mal ein paar Kombinationen testen (später, *gähn*)

Dennis Wronka hat gesagt.:
Uebrigens, ich hab auch eine Klasse fuer solche Spielereien. Der Vorteil: Die Antwort wird gleich mundgerecht aufbereitet.
Hört sich interessant an..
 
Eine nicht ganz aktuelle Version der Klasse ist hier als Tutorial zu finden.
Dort ist aber der User-Agent noch nicht drin. Ich werd das Tutorial mal aktualisieren, ich hab ja schon lange eine Version fertig die auch den User-Agent uebergibt.
Der Referrer ist aber weiterhin nicht drin. Das war mir zu nebensaechlich. ;)
Falls Du Interesse an der Klasse hast und ich es bis dahin noch nicht geschafft hab das Tutorial zu aktualisieren lass es mich wissen, dann lad ich das Script eben hier hoch.
 
Interesse an der Klasse hätte ich schon. Allerdings mehr aus Wissensgründen, als aus Nutzungswillen. Für meine Abfrage reichen mir 10-20 simple Zeilen locker aus. Ich weiß nicht ob ich irgendwann komplexeres anstellen möchte :)

Ich habe mein Script ein wenig umgeschrieben und jetzt funktioniert es auch mit dem User Agent und Referer. Aber seltsamerweise bekomme ich bei einigen Servern auch noch einen seltsamen code vor und nach HTML ...

HTML:
2cf7
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- ... etc. -->
</html>
0
 
Das wird damit zu tun haben, dass die Daten als einzelne Chunks geschickt werden.
Dazu kannst Du Dir in meiner Klasse mal die Methode decodereply() ansehen, da wird auch das Chunking behandelt.
Ich weiss jetzt nur grad nicht ob ich auch explizit darauf eingegangen bin. Auf jeden Fall wird das Paket entsprechend behandelt.
 
Dennis Wronka hat gesagt.:
Das wird damit zu tun haben, dass die Daten als einzelne Chunks geschickt werden.Dazu kannst Du Dir in meiner Klasse mal die Methode decodereply() ansehen, da wird auch das Chunking behandelt.
OMFG! Warum vermiesen mir eigentlich immer kleine fiese hinterhältige Probleme einfache Lösungsansätze :)

fopen hat keine seltsamen Teile in die Chunks gesteckt. fsockopen tut genau das.
Ich mag simple Dinge die funktionieren wie man möchte .. aber nein ... ich muss ja mit der Keule ausholen und 100 Zeilen Quellcode nutzen, statt mit 20 zu arbeiten :suspekt: :-)

P.S.: Die Chunks kommen nur beim HTTP 1.1 Protokoll und nicht bei HTTP 1.0 .. vielleicht bleibe ich bei 1.0 und mein kleines 20 Zeilen Script funktioniert *g*
 
Zuletzt bearbeitet:
Um genau zu sein hat decodereply() 143 Zeilen, was etwas mehr als 1/3 der Klasse ausmacht. ;)
Ich hab uebrigens grad das Archiv im Tutorial aktualisiert, sodass dort nun auch der User-Agent mit drin ist.
Das Tutorial selbst werd ich die Tage mal aktualisieren da ich zur Zeit noch an meinem IPTables-Monster schreibe.
 
Zurück