WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hur upptäcker jag en HEAD request i PHP? (https://www.wn.se/forum/showthread.php?t=1051560)

swan 2011-12-22 01:02

Hur upptäcker jag en HEAD request i PHP?
 
Jag bygger en sida som endast skall stödja GET requests. Hur gör jag i PHP för att upptäcka om någon gör en HEAD eller en POST?

Någon som vet?

Kekke 2011-12-22 01:15

An associative array of variables passed to the current script via the HTTP POST method.

Det borde gå att köra

Kod:

if(isset($_POST)) {
    header ('Location: skickaivag.php');
}
## Samma med $_REQUEST

Men är ej 100 säker.

klein 2011-12-22 04:22

Varför vill man blockera HEAD requester? Bara en nyfiken fråga.

najk 2011-12-22 07:25

Exempelvis
Kod:

if ($_SERVER['REQUEST_METHOD'] != "GET") die("Sorry, we only accept get requests.");

znap 2011-12-22 07:37

Citat:

Ursprungligen postat av Kekke (Inlägg 20428183)
An associative array of variables passed to the current script via the HTTP POST method.

Det borde gå att köra

Kod:

if(isset($_POST)) {
    header ('Location: skickaivag.php');
}
## Samma med $_REQUEST

Men är ej 100 säker.

isset() kollar att en variabel existerar och att den inte är null, $_POST existerar alltid så därför blir det fel. Det du där ska använda är !empty($_POST) vilket kollar att den existerar och inte kan castas till false dvs att den inte är en tom sträng, tom array, null, false, 0, eller en sträng innehållandes en nolla.


Citat:

Ursprungligen postat av klein (Inlägg 20428184)
Varför vill man blockera HEAD requester? Bara en nyfiken fråga.

Han har väl aldrig sagt att han ska blockera anropet?

Rätt kontroll vore alltså att kolla if($_SERVER['REQUEST_METHOD'] == 'head'). Det är dock något underligt varför du vill göra en sån kontroll. Ett anrop med HEAD ska hanteras precis på samma sätt ett anrop med GET enligt specen, däremot behöver inte servern skicka ut svarets body, själva html-koden (eller vad det nu kan vara) som renderas i webbläsaren.

swan 2011-12-22 08:43

Citat:

Ursprungligen postat av najk (Inlägg 20428187)
Exempelvis
Kod:

if ($_SERVER['REQUEST_METHOD'] != "GET") die("Sorry, we only accept get requests.");

Det där verkar rätt. Tack!

Jag har en URL som mäter klick. Och jag har försökt att blockera alla robotar. Men igår såg jag att det i loggarna kom en ny robot som gjorde en "HEAD". Detta gör väl inte normalt människor? Så därför tänkte jag att jag blockar alla "HEAD" requests i framtiden.

Låter det rimligt?

emilv 2011-12-22 09:11

Citat:

Ursprungligen postat av znap (Inlägg 20428188)
Ett anrop med HEAD ska hanteras precis på samma sätt ett anrop med GET enligt specen, däremot behöver inte servern skicka ut svarets body, själva html-koden (eller vad det nu kan vara) som renderas i webbläsaren.

Varför ska man låta PHP generera HTTP-kroppen ifall det bara är huvudet som efterfrågas?

Citat:

Ursprungligen postat av swan (Inlägg 20428189)
Men igår såg jag att det i loggarna kom en ny robot som gjorde en "HEAD". Detta gör väl inte normalt människor? Så därför tänkte jag att jag blockar alla "HEAD" requests i framtiden.

Låter det rimligt?

Jo, normala webbläsare gör ofta HEAD, till exempel om de cachat sidan och vill se ifall de har en aktuell version. Det verkar vansinnigt att blockera HEAD-frågor.

nosnaj 2011-12-22 09:33

Citat:

Ursprungligen postat av swan (Inlägg 20428189)
Det där verkar rätt. Tack!

Jag har en URL som mäter klick. Och jag har försökt att blockera alla robotar. Men igår såg jag att det i loggarna kom en ny robot som gjorde en "HEAD". Detta gör väl inte normalt människor? Så därför tänkte jag att jag blockar alla "HEAD" requests i framtiden.

Låter det rimligt?

Bättre du blockerar på user agent, där står ju exakt vilken sökmotor det är dessutom.

swan 2011-12-22 09:34

Citat:

Ursprungligen postat av nosnaj (Inlägg 20428192)
Bättre du blockerar på user agent, där står ju exakt vilken sökmotor det är dessutom.

Jag blockerar de flesta på user agent redan. Jag är dock lite orolig för de som jag ännu inte känner till...

Citat:

Ursprungligen postat av emilv (Inlägg 20428190)
Jo, normala webbläsare gör ofta HEAD, till exempel om de cachat sidan och vill se ifall de har en aktuell version. Det verkar vansinnigt att blockera HEAD-frågor.

Fast om jag bara vill räkna en person en enda gång borde det vara Ok att blocka HEAD? Eller kanske returnera "ja, du har aktuell version"

emilv 2011-12-22 09:47

Citat:

Ursprungligen postat av swan (Inlägg 20428194)
Fast om jag bara vill räkna en person en enda gång borde det vara Ok att blocka HEAD? Eller kanske returnera "ja, du har aktuell version"

Nu gör du antaganden om alla webbläsares beteenden. Det är inget som stöds av HTTP-standarden som har det här lilla att säga om HEAD:
http://www.w3.org/Protocols/rfc2616/...c9.html#sec9.4

Vill du göra sådana antaganden är det upp till dig. Jag hade inte gjort det.


Alla tider är GMT +2. Klockan är nu 08:05.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson