PDA

Bekijk Volledige Versie : [php] htaccess rewrite rules in combinatie met php headers wijziging



jrf[no]
09/11/04, 02:05
Beste allemaal,

Ik kom er niet meer uit... òf ik ben het onmogelijke aan het proberen òf
ik doe iets heel erg fout...
Wie oh wie weet de oplossing ?

Wat ik wil doen is het volgende:
1. URL gaat naar de (Apache) server
2. Server leest htaccess en herschrijft indien nodig de URL.
Voorbeelden:
contact/ wordt herschreven naar index.php?id=contact
2004/07/24/titia/ wordt herschreven naar index.php?id=20040724titia
3. htaccess bevat ook errordoc directives zoals:
ErrorDocument 404 /index.php?id=error&e=404

4. index.php wordt aangeroepen (als resultaat van de rewrites)
5. index.php checkt in de achterliggende mysql db of een record met het
opgegeven id bestaat en geeft true/false achtig resultaat terug
6. als record niet bestaat, geef ik 404 headers terug aan de server,
anders uiteraard de correcte pagina:
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
exit;
7. 404 gaat terug naar de server en genereert de 404 zoals opgegeven in
het errordocument directive in htaccess en logt de error netjes in het
errorlog


Bovenstaande scenario "werkt" tot en met punt6 in zover dat hetgeen
opgegeven is, uitgevoerd wordt, maar nu komt natuurlijk de crux:

Nadat de 404 via punt (6) doorgegeven is, wordt er een blanco pagina
weergegeven en niet zoals ik zou verwachten mijn "nette" 404.
Punt 7 werkt dus niet zoals ik zou willen / zou verwachten.

Paar voorbeelden:
* Een niet bestaande pagina die *niet* via een rewrite loopt en dus
gelijk door htaccess correct wordt afgevangen met een 404:
http://www.alweereenfotowebsite.nl/testing123/
* Een bestaande pagina die *wel* via een rewrite loopt, geeft de juiste
pagina weer:
http://www.alweereenfotowebsite.nl/2004/07/24/titia/
* Een niet bestaande pagina die *wel* via een rewrite loopt, geeft een
blanco pagina:
http://www.alweereenfotowebsite.nl/test/
http://www.alweereenfotowebsite.nl/2004/07/24/test/

Uiteraard kan ik in het php script e.e.a. aanpassen zodat als het record
niet in de db gevonden wordt, de 404 header meegegeven wordt *en* de
gewenste errorpagina inhoud weergegeven wordt, maar op die manier wordt
de 404 niet als 404 gelogd in het error log en zijn de stats uiteraard
ook niet meer correct.

Weet iemand een manier om via php een 404 door te geven die daarna de in
htaccess opgegeven errordoc ophaalt en de fout netjes logt ?

Alle suggesties / potentiële oplossingen zijn zeer welkom !

Bij voorbaat dank,
Juliette

Daniel Tryba
09/11/04, 04:35
jrf[no] <"jrf[no]"@[spam]jokeaday.net> wrote:
[knip]
> 6. als record niet bestaat, geef ik 404 headers terug aan de server,
> anders uiteraard de correcte pagina:
> header("HTTP/1.0 404 Not Found");
> header("Status: 404 Not Found");
> exit;
> 7. 404 gaat terug naar de server en genereert de 404 zoals opgegeven in
> het errordocument directive in htaccess en logt de error netjes in het
> errorlog
>
>
> Bovenstaande scenario "werkt" tot en met punt6 in zover dat hetgeen
> opgegeven is, uitgevoerd wordt, maar nu komt natuurlijk de crux:
>
> Nadat de 404 via punt (6) doorgegeven is, wordt er een blanco pagina
> weergegeven en niet zoals ik zou verwachten mijn "nette" 404.
> Punt 7 werkt dus niet zoals ik zou willen / zou verwachten.

Op zich niet raar, het enige wat je in (6) doet is de status van de
_huidige_ request veranderen. Simpelste oplossing: include de 404
pagina.

In jou geval met slects 1 controller is dat dus heel simpel te doen door
gewoon op het moment dat je hierboven bij 6 een 404 wilt genereren de
code aan te roepen welke door je 404 handler ook wordt aangeroepen (en
dus niet stiekum een include van de 404 via http (zonde van de
overhead)).

jrf[no]
13/11/04, 02:05
Daniel Tryba wrote:
> jrf[no] <"jrf[no]"@[spam]jokeaday.net> wrote:
> [knip]
>
>>6. als record niet bestaat, geef ik 404 headers terug aan de server,
>>anders uiteraard de correcte pagina:
>> header("HTTP/1.0 404 Not Found");
>> header("Status: 404 Not Found");
>> exit;
>>7. 404 gaat terug naar de server en genereert de 404 zoals opgegeven in
>>het errordocument directive in htaccess en logt de error netjes in het
>>errorlog
>>
>>
>>Bovenstaande scenario "werkt" tot en met punt6 in zover dat hetgeen
>>opgegeven is, uitgevoerd wordt, maar nu komt natuurlijk de crux:
>>
>>Nadat de 404 via punt (6) doorgegeven is, wordt er een blanco pagina
>>weergegeven en niet zoals ik zou verwachten mijn "nette" 404.
>>Punt 7 werkt dus niet zoals ik zou willen / zou verwachten.
>
>
> Op zich niet raar, het enige wat je in (6) doet is de status van de
> _huidige_ request veranderen. Simpelste oplossing: include de 404
> pagina.
>
> In jou geval met slects 1 controller is dat dus heel simpel te doen door
> gewoon op het moment dat je hierboven bij 6 een 404 wilt genereren de
> code aan te roepen welke door je 404 handler ook wordt aangeroepen (en
> dus niet stiekum een include van de 404 via http (zonde van de
> overhead)).
>

Daniel,

Dank voor je reactie.

Ik begrijp eruit dat ik de errorpage code na de header verandering moet
aanroepen (in het script gebeurd dit via includes).

Maar wat ik niet begrijp is wat je bedoelt met:
"(en dus niet stiekum een include van de 404 via http (zonde van
de overhead))."

Zou je me dat nog uit willen leggen ?

Daarnaast blijft dan alsnog mijn vraag staat over de errorlogging : hoe
kan ik ervoor zorgen dat bij een dergelijke 404 het apache errorlog
correct geupdate wordt ?

Wie raad weet mag het zeggen.

Alvast mijn dank !

Grz, Juliette

Daniel Tryba
13/11/04, 02:55
jrf[no] <"jrf[no]"@[spam]jokeaday.net> wrote:
> Ik begrijp eruit dat ik de errorpage code na de header verandering moet
> aanroepen (in het script gebeurd dit via includes).
>
> Maar wat ik niet begrijp is wat je bedoelt met:
> "(en dus niet stiekum een include van de 404 via http (zonde van
> de overhead))."
>
> Zou je me dat nog uit willen leggen ?

Je hebt in je index.php ergens code als:

if($_GET['id']=='error')
{
doeiets();
}

voor de request: http://host.example/index.php?id=error&e=404

Waar ik op doelde was dat indien de functie die het aantal records terug
geeft 0 retouneerd je op dat moment dus doeits() moet aanroepen, eg:
if(countResults()>0)
{
echoResults();
}
else
{
doeiets();
}

en niet :
else
{
include('http://host.tld?id=error&e=404');
}


> Daarnaast blijft dan alsnog mijn vraag staat over de errorlogging : hoe
> kan ik ervoor zorgen dat bij een dergelijke 404 het apache errorlog
> correct geupdate wordt ?

De request is toch correct afgehandeld, daarmee hoort die dus niet in de
error.log: http://httpd.apache.org/docs/logs.html#errorlog

De request is te vinden in de access.log file met de status
die je er zelf aan gegeven heb.

Mocht je de 4xx van de andere request willen scheiden dan denk ik dat je
het best een eigen log kan aanmaken.

jrf[no]
13/11/04, 04:45
Daniel Tryba wrote:

> jrf[no] <"jrf[no]"@[spam]jokeaday.net> wrote:
>
>>Ik begrijp eruit dat ik de errorpage code na de header verandering moet
>>aanroepen (in het script gebeurd dit via includes).
>>
>>Maar wat ik niet begrijp is wat je bedoelt met:
>> "(en dus niet stiekum een include van de 404 via http (zonde van
>> de overhead))."
>>
>>Zou je me dat nog uit willen leggen ?
>
>
> Je hebt in je index.php ergens code als:
>
> if($_GET['id']=='error')
> {
> doeiets();
> }
>
> voor de request: http://host.example/index.php?id=error&e=404
>
> Waar ik op doelde was dat indien de functie die het aantal records terug
> geeft 0 retouneerd je op dat moment dus doeits() moet aanroepen, eg:
> if(countResults()>0)
> {
> echoResults();
> }
> else
> {
> doeiets();
> }
>
> en niet :
> else
> {
> include('http://host.tld?id=error&e=404');
> }
>
>
>
>>Daarnaast blijft dan alsnog mijn vraag staat over de errorlogging : hoe
>>kan ik ervoor zorgen dat bij een dergelijke 404 het apache errorlog
>>correct geupdate wordt ?
>
>
> De request is toch correct afgehandeld, daarmee hoort die dus niet in de
> error.log: http://httpd.apache.org/docs/logs.html#errorlog
>
> De request is te vinden in de access.log file met de status
> die je er zelf aan gegeven heb.
>
> Mocht je de 4xx van de andere request willen scheiden dan denk ik dat je
> het best een eigen log kan aanmaken.
>

Daniel,

Dank voor je reactie.
Ik snap nu wat je bedoelt en gebruikte al de door jou geadviseerde
methode (dus "doeiets" - in dit geval include de relevante tekst voor de
errorpage en niet "include (http://....)" ).

Met betrekking tot de logfiles. Ik begrijp je antwoord. Jammer dat dit
niet werkt zoals ik hoopte.
Ik vind stats pagina's meestal erg handig voor een compleet overzicht
inclusief de errors en begrijp dat dat dus niet meer zal gaan werken.

Dank,
Juliette

Daniel Tryba
13/11/04, 05:35
jrf[no] <"jrf[no]"@[spam]jokeaday.net> wrote:
> Met betrekking tot de logfiles. Ik begrijp je antwoord. Jammer dat dit
> niet werkt zoals ik hoopte.
> Ik vind stats pagina's meestal erg handig voor een compleet overzicht
> inclusief de errors en begrijp dat dat dus niet meer zal gaan werken.

Huh? De status is (hier) het 6de token in een access log regel, het is
dus heel duidelijk of er "errors" tussen zitten. Als jou status pagina
geen onderschijdt maakt in httpstatus van een accesslog file dan is dat
op z'n minst twijfelachtig te noemen...