[Apache2]ErrorDocument in mod_rewrite

Pagina: 1
Acties:

  • mithras
  • Registratie: Maart 2003
  • Niet online
Hallo allemaal,
Ik kom niet uit mijn ErrorDocument directive binnen mod_rewrite. Ik heb een volgende .htaccess om alles goed te zetten:
code:
1
2
3
4
5
6
7
8
9
10
AddDefaultCharset utf8

ErrorDocument 404 error/404

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]


Een verkeerde url krijgt vervolgens binnen de code een juiste 404 header meegestuurd (gecontroleerd). Toch blijft de browser leeg en wordt niet naar cms.localhost/error/404 gestuurd (waarbij cms.localhost het domein is waar alles op draait).

Ik heb een volgende site config aangemaakt voor apache:
code:
1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
 ServerName cms.localhost
 DocumentRoot /var/www/cms
 RewriteLog "/var/log/apache2/rewrite.log"
 RewriteLogLevel 0
 <Directory /var/www/cms>
  AllowOverride All
 </Directory>
</VirtualHost>


Mij lijkt dat dit voldoende moet zijn. Toch vind ik niets terug van de ErrorDocument directive in de log:
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (3) [perdir /var/www/cms/] add path info postfix: /var/www/cms/nl -> /var/www/cms/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (3) [perdir /var/www/cms/] strip per-dir prefix: /var/www/cms/nl/asdasd -> nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (3) [perdir /var/www/cms/] applying pattern '^(.*)$' to uri 'nl/asdasd'
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (4) [perdir /var/www/cms/] RewriteCond: input='/var/www/cms/nl' pattern='!-f' => matched
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (4) [perdir /var/www/cms/] RewriteCond: input='/var/www/cms/nl' pattern='!-d' => matched
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (2) [perdir /var/www/cms/] rewrite 'nl/asdasd' -> 'index.php/nl/asdasd'
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (3) [perdir /var/www/cms/] add per-dir prefix: index.php/nl/asdasd -> /var/www/cms/index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (2) [perdir /var/www/cms/] trying to replace prefix /var/www/cms/ with /
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (5) strip matching prefix: /var/www/cms/index.php/nl/asdasd -> index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (4) add subst prefix: index.php/nl/asdasd -> /index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b9676500/initial] (1) [perdir /var/www/cms/] internal redirect with /index.php/nl/asdasd [INTERNAL REDIRECT]
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b96784d0/initial/redir#1] (3) [perdir /var/www/cms/] add path info postfix: /var/www/cms/index.php -> /var/www/cms/index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b96784d0/initial/redir#1] (3) [perdir /var/www/cms/] strip per-dir prefix: /var/www/cms/index.php/nl/asdasd -> index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b96784d0/initial/redir#1] (3) [perdir /var/www/cms/] applying pattern '^(.*)$' to uri 'index.php/nl/asdasd'
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b96784d0/initial/redir#1] (4) [perdir /var/www/cms/] RewriteCond: input='/var/www/cms/index.php' pattern='!-f' => not-matched
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b96784d0/initial/redir#1] (1) [perdir /var/www/cms/] pass through /var/www/cms/index.php
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (3) [perdir /var/www/cms/] add path info postfix: /var/www/cms/nl -> /var/www/cms/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (3) [perdir /var/www/cms/] strip per-dir prefix: /var/www/cms/nl/asdasd -> nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (3) [perdir /var/www/cms/] applying pattern '^(.*)$' to uri 'nl/asdasd'
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (4) [perdir /var/www/cms/] RewriteCond: input='/var/www/cms/nl' pattern='!-f' => matched
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (4) [perdir /var/www/cms/] RewriteCond: input='/var/www/cms/nl' pattern='!-d' => matched
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (2) [perdir /var/www/cms/] rewrite 'nl/asdasd' -> 'index.php/nl/asdasd'
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (3) [perdir /var/www/cms/] add per-dir prefix: index.php/nl/asdasd -> /var/www/cms/index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (2) [perdir /var/www/cms/] trying to replace prefix /var/www/cms/ with /
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (5) strip matching prefix: /var/www/cms/index.php/nl/asdasd -> index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (4) add subst prefix: index.php/nl/asdasd -> /index.php/nl/asdasd
127.0.0.1 - - [25/Jan/2009:13:38:12 +0100] [cms.localhost/sid#b94d78a8][rid#b967f680/subreq] (1) [perdir /var/www/cms/] internal redirect with /index.php/nl/asdasd [INTERNAL REDIRECT]


Na wat zoeken zie ik dat slechts weinigen met dit systeem werken. Ik krijg het prima werkend zonder ErrorDocument. Zonder de mod_rewrite zal het vast ook wel werken. Deze combinatie maakt het denk ik best lastig. Iemand ideeën hoe ik dit kan fixen?

  • mithras
  • Registratie: Maart 2003
  • Niet online
Volgens mij is mijn probleem niet heel erg populair :+ Heeft niemand een idee / suggestie?

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik had het even laten liggen. Nu ben ik er weer mee bezig, maar ook met nieuwe inzichten kom ik niet verder. Iemand een idee?

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 08:49
Volgens mij heeft errordocument niks te maken met mod_rewrite. Kijk eens in je normale acces_log en error_log ?

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 06-02 16:05
Met welke browser probeer je dit? IE laat standaard dergelijke "eigen" foutpagina's niet zien.
Zet Tools > Internet Options > Advanced > Show friendly HTTP error messages uit.

edit;
De server 404 zul je nooit krijgen zolang je al je requests doorverwijst naar je index.php
Je kunt best binnen dat script een header("HTTP/1.1 404 Not Found") status terug geven, maar dat betekend niet dat je 404-document automatisch ook meegestuurd wordt.

[ Voor 42% gewijzigd door frickY op 21-03-2009 22:32 ]


  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

frickY schreef op zaterdag 21 maart 2009 @ 22:30:
Met welke browser probeer je dit? IE laat standaard dergelijke "eigen" foutpagina's niet zien.
Zet Tools > Internet Options > Advanced > Show friendly HTTP error messages uit.
...of je zorgt ervoor dat je 404 error pagina groter dan 512 Bytes is ;)
Description of Hypertext Transport Protocol Error Messages

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • mithras
  • Registratie: Maart 2003
  • Niet online
Luqq schreef op zaterdag 21 maart 2009 @ 22:07:
Volgens mij heeft errordocument niks te maken met mod_rewrite. Kijk eens in je normale acces_log en error_log ?
Nou, dat lijkt me ook. Het enige punt is dat ik al mijn url's opbouw als http://domein.nl/nl/blog. Die verwijst door naar index.php waar ik 'nl/blog' afvang en in mijn cms verder verwerk. Dit moet dus ook gebeuren met 'http://domein.nl/error/404' waar 'error' de module is die met '404' een vriendelijke 404 pagina kan tonen.

Verder: mijn errorlog vermeldt niets over deze request. Mijn access log bevat de verwachte resultaten (eerst expres een foute url opgevraagd, daarna een juiste ingevoerd):
code:
1
2
cms.localhost:80 127.0.0.1 - - [21/Mar/2009:23:44:55 +0100] "GET /nl/asdasd HTTP/1.1" 404 20 "-" "Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7"
cms.localhost:80 127.0.0.1 - - [21/Mar/2009:23:45:36 +0100] "GET /nl/ HTTP/1.1" 200 2298 "-" "Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7"
frickY schreef op zaterdag 21 maart 2009 @ 22:30:
Met welke browser probeer je dit? IE laat standaard dergelijke "eigen" foutpagina's niet zien.
Zet Tools > Internet Options > Advanced > Show friendly HTTP error messages uit.

edit;
De server 404 zul je nooit krijgen zolang je al je requests doorverwijst naar je index.php
Je kunt best binnen dat script een header("HTTP/1.1 404 Not Found") status terug geven, maar dat betekend niet dat je 404-document automatisch ook meegestuurd wordt.
Ik geef in mijn script een 404 melding. Dit heb ik gecontroleerd omdat ik LiveHeaders in Firefox heb. Hiermee zie ik dat ik een 404 van een bepaalde url terugkrijg. Ook met online header fetchers krijg ik dat resultaat, alsmede in bovenstaand stukje van /var/log/apache2/other_vhosts_access.log.

Ik denk dus echt dat het aan de combinatie ErrorDocument met een RewriteRule ligt.
alt-92 schreef op zaterdag 21 maart 2009 @ 23:05:
[...]

...of je zorgt ervoor dat je 404 error pagina groter dan 512 Bytes is ;)
Description of Hypertext Transport Protocol Error Messages
Ik gebruik dus geen Firefox (sorry, vergeten te melden). Dit is de volledige output van LiveHeaders bij een foutieve url:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
http://cms.localhost/nl/asdasd

GET /nl/asdasd HTTP/1.1
Host: cms.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: qwikSession=2ea50ba5aa5aed5db4d7b71b10688eda; PHPSESSID=1828a9d29aad3105882c5cc1a59eb5b5

HTTP/1.1 404 Not Found
Date: Sat, 21 Mar 2009 22:53:42 GMT
Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4.1 with Suhosin-Patch
X-Powered-By: PHP/5.2.6-2ubuntu4.1
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf8

In ieder geval bedankt voor jullie meedenken (ik zit hier al lang mee, alle reacties -welke dan ook- helpen al ;) )!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

mithras schreef op zaterdag 21 maart 2009 @ 23:56:
[...]
Ik geef in mijn script een 404 melding. Dit heb ik gecontroleerd omdat ik LiveHeaders in Firefox heb. Hiermee zie ik dat ik een 404 van een bepaalde url terugkrijg. Ook met online header fetchers krijg ik dat resultaat, alsmede in bovenstaand stukje van /var/log/apache2/other_vhosts_access.log.

Ik denk dus echt dat het aan de combinatie ErrorDocument met een RewriteRule ligt.
Het klopt dat het aan de combinatie ligt; maar niet omdat er een bug oid inzit; wat je wilt is gewoon onmogelijk.

De Rewriterule zegt; stuur alles naar de applicatie toe. Hier houdt de logica van Apache op en begint je applicatie. Als jouw applicatie vervolgens een 404 verstuurd kan Apache dat niet zoveel schelen ;) Je zult dus vanuit je applicatie zelf de error-page moeten doorsturen; of misschien iets smerigs moeten doen zoals virtual()

Apache controleert de response van je applicatie niet.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • mithras
  • Registratie: Maart 2003
  • Niet online
Spider.007 schreef op zondag 22 maart 2009 @ 13:15:
[...]

Het klopt dat het aan de combinatie ligt; maar niet omdat er een bug oid inzit; wat je wilt is gewoon onmogelijk.

De Rewriterule zegt; stuur alles naar de applicatie toe. Hier houdt de logica van Apache op en begint je applicatie. Als jouw applicatie vervolgens een 404 verstuurd kan Apache dat niet zoveel schelen ;) Je zult dus vanuit je applicatie zelf de error-page moeten doorsturen; of misschien iets smerigs moeten doen zoals virtual()

Apache controleert de response van je applicatie niet.
Aha! :p

Dat is niet zo leuk om te horen :> Maar ik kan er wel wat verder mee. Wanneer ik in mijn applicatie iets tegenkom wat niet werkt, doe ik iets als sendHeader('404') of welke code dan ook. In die functie staat het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public function sendHeader( $code, $autoExit = true ){
        switch( $code ){
            case '400':
                $str = 'Bad Request';
                break;
            case '401':
                $str = 'Unauthorized';
                break;
            case '402':
                $str = 'Payment Required';
                break;
            case '403':
                $str = 'Forbidden';
                break;
            case '404':
                $str = 'Not Found';
                break;
            default:
                $this->sendHeader( '404' );
        }
        $header = sprintf( 'HTTP/1.1 %s %s', $code, $str );
        header( $header );
        if( $autoExit ) exit();
    }
Ik kan natuurlijk ook gewon een 303 See Other sturen, welke intern dus naar /error/$code gaat. Dat zou dus probleem moeten oplossen (dank!), maar dan heb ik nog een vraag.

Graag zou ik toch (vanwege SEO e.d.) de juiste header kunnen sturen. Het lijkt me wel tot een mogelijkheid behoren binnen mijn module 'error' (die dus een friendly message genereert) toch naast de html content óók een 404 te sturen?

offtopic:
Nog wel benieuwd: het lijkt me niet een hele vreemde constructie wat ik wil. Het is toch by-design zo geregeld. Ben ik gewoon omwegen aan het maken of is dit typisch een feature voor Apache3 zegmaar :p?

[ Voor 4% gewijzigd door mithras op 22-03-2009 13:40 ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Volgens mij mis ik een beetje wat je met je laatste vraag bedoelt; je stuurt nu toch al een HTTP-404 header? Het enige wat je hier aan toe moet voegen (in je huidige sendHeader dus) is dat je tussen je header en je exit; ook nog wat content meestuurt. Op die manier zou het allemaal netjes en goed moeten gaan :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • mithras
  • Registratie: Maart 2003
  • Niet online
Ja, je hebt gelijk. Natuurlijk kan je na een 404 nog gewoon content mee sturen. Dat is natuurlijk geen probleem. Het is nu opgelost :)
Pagina: 1