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.

hnn 2011-12-22 10:38

Vill du inte stödja HEAD, så stöd inte HEAD. Vad sen RFC och dylikt säger borde du egentligen skita i.

Det står i lagen att du enbart får gå över vägen på övergångsställen och i dom fall där det finns, enbart vid grön gubbe. Och hur många följer det?

Gör precis som du vill och skit i vad folk säger här.

Clarence 2011-12-22 10:48

Citat:

Ursprungligen postat av hnn (Inlägg 20428200)
Vill du inte stödja HEAD, så stöd inte HEAD. Vad sen RFC och dylikt säger borde du egentligen skita i.

Det står i lagen att du enbart får gå över vägen på övergångsställen och i dom fall där det finns, enbart vid grön gubbe. Och hur många följer det?

Gör precis som du vill och skit i vad folk säger här.

Vilket bra råd. Man ska skita i specen som webbläsarnas beteende är ett derivat av? Man ska också göra det utan ytterligare kunskap om hur denna, förmodligen onödiga, förändring påverkar besökarna? Är för mig mer som att gå över vägen vid rött ljus och blunda och hoppas att man inte blir påkörd.

Har du hört talas om det norge-ordvitsen "Skjut dig själv och skit i andra"? Din kontenta låter ungefär likadan för mig :)

hnn 2011-12-22 11:02

Citat:

Ursprungligen postat av Clarence (Inlägg 20428201)
Vilket bra råd. Man ska skita i specen som webbläsarnas beteende är ett derivat av? Man ska också göra det utan ytterligare kunskap om hur denna, förmodligen onödiga, förändring påverkar besökarna? Är för mig mer som att gå över vägen vid rött ljus och blunda och hoppas att man inte blir påkörd.

Har du hört talas om det norge-ordvitsen "Skjut dig själv och skit i andra"? Din kontenta låter ungefär likadan för mig :)

Allting är väl upp till var och en.
Se på Internet Explorer, Microsoft har ju skitit i RFCn i 10 år. Är där någon som följer RFCn till 100% eller W3C?

emilv 2011-12-22 11:32

Citat:

Ursprungligen postat av hnn (Inlägg 20428204)
Allting är väl upp till var och en.
Se på Internet Explorer, Microsoft har ju skitit i RFCn i 10 år. Är där någon som följer RFCn till 100% eller W3C?

De flesta webbläsare, inklusive Internet Explorer, följer RFC 2616 (HTTP-standarden). För det är väl den vi pratar om här? RFC 2616 är inte bara en W3C-standard, den är även antagen av IETF. Ditt yttrande är alltså på ungefär samma nivå som "skit i TCP-standarden". Hur bra tror du nätverkskommunikationen fungerar då?

Du har förstås rätt: det är fritt fram att strunta i alla standarder, men då får man också räkna med att man får problem med att kommunicera i ett nätverk.

hnn 2011-12-22 11:56

Citat:

Ursprungligen postat av emilv (Inlägg 20428206)
De flesta webbläsare, inklusive Internet Explorer, följer RFC 2616 (HTTP-standarden). För det är väl den vi pratar om här? RFC 2616 är inte bara en W3C-standard, den är även antagen av IETF. Ditt yttrande är alltså på ungefär samma nivå som "skit i TCP-standarden". Hur bra tror du nätverkskommunikationen fungerar då?

Du har förstås rätt: det är fritt fram att strunta i alla standarder, men då får man också räkna med att man får problem med att kommunicera i ett nätverk.


Kör jag telnet till en webserver och skriver in:
HEAD /index.php HTTP/1.1

Så för jag inte med content. Utan enbart svar från webservern med HTTP huvud. Alltså, korrekt förfarande är ju:

Kod:

If($_SERVER['REQUEST_METHOD'] == 'HEAD') exit;
eller är jag ute o cyklar? För resultatet borde ju bli samma? Servern skickar ju inte ut Content och därmed onödigt att behandla om det nu är en tung sida.

Och det är väl resultatet som är viktigt sen hur man uppnår det är väl upp till var och en.

emilv 2011-12-22 12:08

Citat:

Ursprungligen postat av hnn (Inlägg 20428213)
eller är jag ute o cyklar? För resultatet borde ju bli samma? Servern skickar ju inte ut Content och därmed onödigt att behandla om det nu är en tung sida.

Och det är väl resultatet som är viktigt sen hur man uppnår det är väl upp till var och en.

Vad svarar du på nu? Jag har också sagt att det kan vara smart att låta bli att generera sidkroppen. Vad har det med ditt yttrande om att skita i standarder att göra?

captaindoe 2011-12-22 15:03

Swan:
Du nämnde att du var orolig för att du inte kunde blockera alla bots.
Jag rekommenderar dig att använda http://www.stopforumspam.com/ för att kontrollera IP adress.


Alla tider är GMT +2. Klockan är nu 23:03.

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