[PHP / MOD_REWRITE] Directory based redirect

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Ik ben een beetje aan het stoeien met custom redirects op basis van in welke directory je je op een bepaald moment zit, en ik wil dit graag zo universeel mogelijk houden. Lang verhaal kort: Ik heb 1 class die systemwide kijkt of je een bepaalde pagina wel mag zien; zo niet dan moet er geredirect worden naar een 401 pagina (oid).

Nou wil ik zoveel mogelijk afblijven van arguments meegeven aan die class, en een pad uitpluizen in de class gaat niet lukken omdat er gebruik gemaakt wordt van MOD_REWRITE in de .htaccess, dus de $_SERVER['REQUEST_URI'] is niet altijd even betrouwbaar.

Nou had ik het volgende bedacht maar dit werkt niet zonder kanttekeningen. Stel; de class vindt dat de huidige user geen toegang mag krijgen tot de pagina: de class exit met een header('HTTP/1.1 401 Unauthorized'). Op dat moment zou ik graag willen dat PHP het overlaat aan de .htaccess waar de 401 naartoe geredirect wordt. Echter, dit werkt niet, omdat een 401 header niet écht een 401 is, het is een correct weergegeven pagina met een 401 header.

Is er een workaround voor dit probleem, of is er iets wat ik over het hoofd zie?

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
PHP:
1
2
3
header('HTTP/1.1 401 Unauthorized');
header('Location: http://www.example.org/401.html');
exit();

Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
HuHu schreef op donderdag 08 oktober 2009 @ 14:10:
PHP:
1
2
3
header('HTTP/1.1 401 Unauthorized');
header('Location: http://www.example.org/401.html');
exit();
Dát wil ik dus juist niet; zover was ik ook wel. Een header redirect is níet wat ik wil: ik wil 't aan de .htaccess over laten waar de 401 naartoe geredirect wordt. Zo kan ik met 1 class 1 universele 401 throwen, en per directory de .htaccess laten vertellen wat er met die 401 moet gebeuren.
In principe wil ik dus zoiets:
PHP:
1
2
header('HTTP/1.1 401 Unauthorized');
exit();

code:
1
2
RewriteEngine On
ErrorDocument 401 /foo/bar


edit:

Ik ben nog even wat dieper gaan graven, en uit de resultaten lijkt het erop dat dit niet mogelijk is. Pagina's zoals deze en deze scheppen niet echt veel hoop

[ Voor 34% gewijzigd door Scyth op 08-10-2009 14:42 ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 17-09 14:22
Als de PHP-executie eenmaal gestart is kun je de afhandeling niet meer "teruggeven" aan apache. Die errordocument regel is er alleen om aan te geven wat apache moet weergeven nadat _apache_ tegen een 401 aanloopt. Ben je eenmaal "in" PHP dan is het aan PHP om een error document te tonen.

Als PHP in cgi-modus draait is het wellicht een idee om een apache environment var te definieren.
code:
1
SetEnv ERRDOC_401 /foo/bar
. In PHP zou je die dan terug moeten vinden in de $_ENV[] superglobal. Ik heb het verder niet getest, maar goed.

Verder snap ik je probleem niet zo goed. Waarom zou je in de class die vaststelt of iemand iets mag zien willen redirecten?. Imho moet je het redirecten ergens anders onderbrengen. En mocht je dan toch echt besluiten dat de klasse een errordocument laat zien dan zou ik daar gewoon een parameter voor meegeven aan de klasse. Dat is een stuk makkelijker (en universeler) dan in een .htaccess klooien om maar ergens een global gedefinieerd te krijgen en daar je klasse van afhankelijk maken.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Scyth schreef op donderdag 08 oktober 2009 @ 14:15:
[...]

Dát wil ik dus juist niet; zover was ik ook wel. Een header redirect is níet wat ik wil: ik wil 't aan de .htaccess over laten waar de 401 naartoe geredirect wordt. Zo kan ik met 1 class 1 universele 401 throwen, en per directory de .htaccess laten vertellen wat er met die 401 moet gebeuren.
In principe wil ik dus zoiets:
PHP:
1
2
header('HTTP/1.1 401 Unauthorized');
exit();

code:
1
2
RewriteEngine On
ErrorDocument 401 /foo/bar


edit:

Ik ben nog even wat dieper gaan graven, en uit de resultaten lijkt het erop dat dit niet mogelijk is. Pagina's zoals deze en deze scheppen niet echt veel hoop
Wat is het verschil dan tussen status 401 of redirect naar 401.html? Je moet bij beiden een header afgeven die iets doet. Met de ene lukt het niet, dan gebruik je toch de andere?

In je .htaccess kun je die 401.html altijd weer herschrijven naar iets anders. Het gaat er om dat je met een redirect wél opnieuw langs je .htaccess komt en met alleen een HTTP status niet.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 17-09 20:56
Je snapt het punt van HuHu niet. Je kunt per request eenmaal in PHP niet meer gebruik maken van htaccess. Door een redirect krijg je een nieuwe request die opnieuw via apache gaat. Op dat moment kun je pas gebruik maken van je htaccess.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 10:22

MueR

Admin Tweakers Discord

is niet lief

Imho moet je bij een 40X code nooit redirecten. Een pagina tonen kan prima. Heeft als bijkomend voordeel dat mensen ook meteen de url van de falende pagina kunnen doorgeven, wat bij een redirect niet meer mogelijk is. Persoonlijk vind ik het netter.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
MueR schreef op vrijdag 09 oktober 2009 @ 15:01:
Imho moet je bij een 40X code nooit redirecten. Een pagina tonen kan prima. Heeft als bijkomend voordeel dat mensen ook meteen de url van de falende pagina kunnen doorgeven, wat bij een redirect niet meer mogelijk is. Persoonlijk vind ik het netter.
Scyth wil langs de .htacces, dus dan moet je redirecten. Wat mij betreft is het ook beter om binnen je applicatie te blijven en het daar af te handelen. Als er een fout optreed zou er gewoon een exception opgeworden moeten worden, die elders wordt afgevangen en de juiste foutmelding en -pagina toont.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Echter, dit werkt niet, omdat een 401 header niet écht een 401 is, het is een correct weergegeven pagina met een 401 header.
Wat is het verschil dan volgens jou? Die 401 pagina van apache is ook gewoon een html-pagina maar dan met de 401 header geserveerd. Ik ben t eens met HuHu, toon gewoon binnen je applicatie een mooie foutpagina met wellicht "bedoelde u misschien..." of een sitemap.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 17-09 20:56
MueR schreef op vrijdag 09 oktober 2009 @ 15:01:
Imho moet je bij een 40X code nooit redirecten. Een pagina tonen kan prima. Heeft als bijkomend voordeel dat mensen ook meteen de url van de falende pagina kunnen doorgeven, wat bij een redirect niet meer mogelijk is. Persoonlijk vind ik het netter.
Mee eens. Dat is alleen niet waar de TS om vraagt. :)

Ik vind het zelf altijd het gemakkelijkst om zoveel mogelijk in PHP te doen en zo weinig mogelijk in htaccess. PHP geeft je veel meer controle over dingen zoals wachtwoorden, ip-blokkades of url-rewriting. Gewoon alle requests op een domein naar één PHP-file en dan die laten uitzoeken wat er met welke url moet worden getoond.
Pagina: 1