[PHP] URL check redirect werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 117291

Topicstarter
Ik ben eigenlijk iemand van asp.net 2.0 en zit hier dus een beetje mee vast. Ik heb nu een het volgende scriptje :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

if ( $HTTP_REFERER == "http://www.google.nl" ) 
{
    header("Location: http://www.tweakers.net");
    exit;
} 
else 
{
    header("Location: www.lycos.nl");
    exit;
} 

?>


(url's zijn even vervangen voor het voorbeeldje)

Als een gebruiker op de pagina komt via een bepaalde url wordt er aan de hand hiervan gekeken waar de user naartoe geredirect moet worden. Momenteel lijkt het wel te werken alleen komt het scriptje vast te zitten in een loop.


Iemand een idee ?

Alvast bedankt

[ Voor 6% gewijzigd door Anoniem: 117291 op 18-05-2006 21:31 ]


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 13-06 08:04

killercow

eth0

je else, geen een relatieve url op, geen absolute, met http,

check dat even in je origineel.

De exit hoeft trouwens niet, het script loopt toch wel af.

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Na een redirect hoor je altijd een die() of exit() te doen.

Als je in een loop terecht komt, dan neem ik aan dat je script redirect naar zichzelf? Kijk dat eens goed na?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 15-12-2024
Als dit de enige php-code is kan hij moeilijk in een loop terechtkomen. Hoe 'zie' je trouwens dat hij in een loop zit (terwijl hij het wel doet)?

Waar je wel naar zou kunnen kijken is of hij in het originele script niet naar zichzelf redirect.


(trwns, in je tweede redirect zou ik ff http:// erbij zetten)


spuit11

[ Voor 5% gewijzigd door Pete op 18-05-2006 21:38 ]

petersmit.eu


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 13-06 08:04

killercow

eth0

-NMe- schreef op donderdag 18 mei 2006 @ 21:37:
Na een redirect hoor je altijd een die() of exit() te doen.

Als je in een loop terecht komt, dan neem ik aan dat je script redirect naar zichzelf? Kijk dat eens goed na?
says who?

Ik gebruik nogal eens een hele bult code om een stukje statistiek te verwerken.
Meer dan de request heb ik niet nodig, en van mij mag de browser dan rustig doorspringen naar de banner afbeelding oid.

Ik kan dan rustig m'n tijd nemen om alles goed te loggen, want de browser hoeft dan niet meer op het script te wachten.

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

Anoniem: 117291

Topicstarter
Oops sorry jullie hebben gelijk. Ik had in de else redirect een url opgegeven die naar hetzelfde bestand verwijst. Heb namelijk 2 domeinnamen die gebruik maken van dezelfde webspace op een externe webshost.

In iederegeval bedankt voor de replay's.

Nogmaals sorry voor de stomme fout :-S

Acties:
  • 0 Henk 'm!

Anoniem: 64721

Een nettere manier om een redirect uit te voeren:

code:
1
2
3
4
header("HTTP/1.1 302 Object moved");
header("Date: ".date("D, d M Y H:i:s \G\M\T"));
header("Location: tweakers.net");
header("Connection: close");


niet dat alleen location alleen niet werkt, maar dit is volgens de standaards

Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 13-06 08:04

killercow

eth0

Anoniem: 64721 schreef op vrijdag 19 mei 2006 @ 22:01:
Een nettere manier om een redirect uit te voeren:

code:
1
2
3
4
header("HTTP/1.1 302 Object moved");
header("Date: ".date("D, d M Y H:i:s \G\M\T"));
header("Location: tweakers.net");
header("Connection: close");


niet dat alleen location alleen niet werkt, maar dit is volgens de standaards
Voor zover ik weet moet je in Location http headers altijd een absoluut pad opgeven, maar zal het even checken.

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 14-06 22:18
killercow schreef op vrijdag 19 mei 2006 @ 22:03:
[...]


Voor zover ik weet moet je in Location http headers altijd een absoluut pad opgeven, maar zal het even checken.
Werkt ook met relatieve paden
PHP:
1
2
3
4
if ($foutieve_invoer)
{
   header('location: /index.php');
}

Is iets wat ik zeer regelmatig gebruik.

Verder kijkt TS naar $HTTP_REFERER, dat klinkt als register_globals. $_SERVER['HTTP_REFERER'] lijkt me toch te prefereren.

[ Voor 16% gewijzigd door StevenK op 19-05-2006 22:12 ]

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Anoniem: 64721 schreef op vrijdag 19 mei 2006 @ 22:01:
Een nettere manier om een redirect uit te voeren:

code:
1
2
3
4
header("HTTP/1.1 302 Object moved");
header("Date: ".date("D, d M Y H:i:s \G\M\T"));
header("Location: tweakers.net");
header("Connection: close");


niet dat alleen location alleen niet werkt, maar dit is volgens de standaards
Waarom zoveel werk doen, als fatsoenlijke webservers dat allemaal voor je doen? Apache wel iig :)

Acties:
  • 0 Henk 'm!

Anoniem: 64721

Osiris schreef op vrijdag 19 mei 2006 @ 22:14:
[...]

Waarom zoveel werk doen, als fatsoenlijke webservers dat allemaal voor je doen? Apache wel iig :)
Webservers die dat allemaal voor je doen? Volgens mij doet de webserver niets anders als de headers doorsturen naar de client (IE, Netscape, FireFox etc...) deze clients behandelen dan deze headers als een redirect oftwel dit heeft helemaal niets met de webserver te maken.

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Anoniem: 64721 schreef op vrijdag 19 mei 2006 @ 22:22:
[...]

Webservers die dat allemaal voor je doen? Volgens mij doet de webserver niets anders als de headers doorsturen naar de client (IE, Netscape, FireFox etc...) deze clients behandelen dan deze headers als een redirect oftwel dit heeft helemaal niets met de webserver te maken.
Als jij een header('Location: bladiebla'); doet in PHP, dan krijg ik iig een 302 als output en geen HTTP 200... Kan ook abuis zijn dat PHP dat allemaal voor je regelt, maar zo'n 302 en datum etc etc etc zélf setten is vrij overbodig :)

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Anoniem: 64721 schreef op vrijdag 19 mei 2006 @ 22:22:
[...]


Webservers die dat allemaal voor je doen? Volgens mij doet de webserver niets anders als de headers doorsturen naar de client (IE, Netscape, FireFox etc...) deze clients behandelen dan deze headers als een redirect oftwel dit heeft helemaal niets met de webserver te maken.
php doet het voor je ;)

als jij een 'location: ' stuurt wordt volgens mij ook een 302 verstuurd.
verder hoeft de exit niet persee, want als je data stuurt worden je headers eerst gelezen, bij een 302 word er niet naar de inhoud, maar alleen naar de header location gekeken, en dus boeit het opzich niet.

Enige nadeel is dat je php langer parsed (gok ik) en dat je meer data verstuurd (gok ik) het zou best kunnen dat php zelf niet eens data stuurt als je een location header verstuurd

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • plakbandrol
  • Registratie: Juni 2002
  • Laatst online: 13-06 10:21
kun je niet beter $_SERVER['HTTP_REFERER'] gebruiken?

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
BasieP schreef op vrijdag 19 mei 2006 @ 22:29:
[...]

Enige nadeel is dat je php langer parsed (gok ik) en dat je meer data verstuurd (gok ik) het zou best kunnen dat php zelf niet eens data stuurt als je een location header verstuurd
PHP stuurt de data gewoon nog mee :) (net getest)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:44

crisp

Devver

Pixelated

Als we het dan toch over 'nette' manieren gaan hebben:
10.3.3 302 Found

The requested resource resides temporarily under a different URI. Since the redirection might be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.

The temporary URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).
Kortom: enkel een 302 header zonder body is niet zo netjes ;)
Verder: bedenk ook even of een 302 wel de juiste statuscode is (en het is 302 Found en niet 302 Object Moved) - hij is namelijk bedoelt voor resources die tijdelijk onder een ander URI beschikbaar zijn.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Anoniem: 64721

Klopt, ik heb het net even opgezocht op php.net:
Er zijn twee speciale header calls. De eerste is een header die begint met de string "HTTP/" (case is onbelangrijk), die wordt gebruikt om uit te zoeken welke HTTP status moet worden verzonden. Bijvoorbeeld, als je Apache hebt geconfigureerd om een PHP script te gebruiken om requests voor ontbrekende bestanden af te handelen (door de ErrorDocument directive te gebruiken), wil je er misschien voor zorgen dat je script de goede status code genereert.

PHP:
1
2
3
<?php
header("HTTP/1.0 404 Not Found");
?> 



Opmerking: De http status header is altijd de eerste die wordt verstuurd naar de client, of de actuele header() nu de eerste aanroep is of niet. De status header kan worden aangepast met het aanroepen van de header() met daarin een nieuwe status regel, mits de headers al niet zijn verstuurd naar de client.

Opmerking: In PHP 3 werkt dit alleen als PHP is gecompileerd als een Apache module. Je kunt echter hetzelfde effect verkrijgen door middel van het gebruiken van de Status header.

PHP:
1
2
3
<?php
header("Status: 404 Not Found");
?> 


De tweede speciale case is de "Location:" header. Deze header wordt niet alleen teruggestuurd naar de browser, maar hij geeft ook een REDIRECT (302) status code aan de browser tenzij een 3xx status code al eerder werd ingesteld.

PHP:
1
2
3
4
<?php
header("Location: http://www.php.net/"); /* Stuur de browser naar de PHP website */
exit;                        /* Zorg dat de code hieronder niet wordt uitgevoerd */
?>  


Opmerking: HTTP/1.1 heeft een absolute URI als argument voor Location:, inclusief het schema, de hostname en absoluut pad, maar sommige clients accepteren relatieve URIs. Je kunt normaal $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] en dirname() gebruiken om zelf een absolute URI te maken van een relatieve:

PHP:
1
2
3
4
5
6
<?php
header("Location: http://".$_SERVER['HTTP_HOST']
                          .dirname($_SERVER['PHP_SELF'])
                          ."/".$relative_url);
?>
 


PHP scripts genereren vaak dynamische content die niet mag worden gecached door de client browser of een proxy cache tussen de server en de client browser. Je kunt veel proxies en clients kunnen forceren het cachen uit te zetten met

PHP:
1
2
3
4
5
6
7
8
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum in het verleden
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                                     // Altijd veranderd
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");                          // HTTP/1.0
?>  


Opmerking: Het zou kunnen dat je pagina's zelfs niet worden gecached als je niet alle headers hierboven meestuurt. Er zijn een aantal opties die gebruikers zelf kunnen instellen voor hun browser die ervoor zorgen dat hun standaard caching gedrag verandert. Door de bovenstaande headers mee te sturen kun je alle instellingen die anders zorgen dat de output van je script wordt gecached overschrijven.
Dus ja, met een location word er ook automatisch een 302 meegestuurd (ik zat hier fout).
Het is dus ook beter om absolete urls op te geven ipv relative urls.
Wat ik me echter nog wel afvraag is of er ook een date word meegestuurd.

[ Voor 6% gewijzigd door Anoniem: 64721 op 19-05-2006 22:50 ]


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Anoniem: 64721 schreef op vrijdag 19 mei 2006 @ 22:46:
Wat ik me echter nog wel afvraag is of er ook een date word meegestuurd.
HTTP/1.1 302 Found
Date: Fri, 19 May 2006 20:30:25 GMT
Server: Apache
X-Powered-By: PHP/4.4.2-pl2-gentoo
Location: http://bladiebla
Content-Script-Type: text/javascript
Content-Length: 9
Content-Type: text/html; charset=ISO-8859-15

BladieblaConnection closed by foreign host.


Ja dus :)
Pagina: 1