Moin!
ich hoffe, es kann mir jemand weiterhelfen oder wenigstens einen Denkanstoss verpassen.
Denkanstoss:
if (!strstr($_SERVER['HTTP_ACCEPT_LANGUAGE'], "de"))
strstr() ist nicht die Funktion, die man verwenden sollte, wenn man nur das Vorhandensein von Strings in anderen Strings prüfen will. strpos() wäre da korrekt.
Zweitens: Hast du dir mal real auftretende Werte von HTTP_ACCEPT_HEADER angesehen und nachgeprüft, welche Funktionsergebnisse strstr() dir zurückliefert? Ich tippe: Nein!
Der Rückgabewert ist der String, der inklusive des ersten Auftreten des Suchwortes noch als Rest verbleibt. Alles davor wird abgeschnitten. Solch ein Stringfragment würde ich höchst ungern in das boolsche Typecasting reintun, man weiß einfach nicht genau, was da passiert. Obendrein ist strstr() case-sensitiv, du prüfst also explizit nur auf kleingeschriebenes "de", absolut erlaubt bzw. vorkommend ist aber auch "DE".
{ header("Location: ?view=post&cityid=-1&lang=de&catid=1"); }
Drittens: Es ist keine gute Idee, eine Endlosschleife zu bauen. Dein Problem ist doch, den Spam loszuwerden. Also warum länger mit solchen als blöd erkannten Requests herumschlagen? Unter der Annahme, dass dein Erkennungsfilter korrekt arbeitet, wäre eine korrekte Antwort das Senden irgendeines 400er-Headers, beispielsweise 403. Und gut ist.
Gibt es da eine elegantere Lösung, um nur User aus Deutschland, Österreich und der Schweiz zuzulassen ?
Es gibt keine elegante Lösung. Dein Problem ist ja auch nicht, dass du nur User dieser drei Länder zulassen willst, sondern du willst Spam loswerden. Das ist qualitativ ein ganz anderes Problem.
- Sven Rautenberg