luti: header() 404-Meldung funktioniert nicht

Hallo,

auf meiner Webseite wird die URL per RewriteRule in der .htaccess auf index.php umgeleitet. Als so ziemlich erstes prüfe ich in einer PHP-Funktion auf Syntax. Z.B. soll die eigegebene URL die From "www.domain.de/dir/page" haben. Sind im übergebenen String mehr als ein Slash enthalten, möchte ich eine 404-Fehlermeldung ausgeben. Aber die wird anscheind nicht ausgrführt (ein "header('Location: /fehler.html');") funkioniert an dieser Stelle problemlos. Folgende Code-Ausschnitte:

.htaccess:
ErrorDocument 404 /fehler.html
RewriteEngine on
Options FollowSymLinks
RewriteBase /
RewriteCond  %{REQUEST_FILENAME} !-d
RewriteCond  %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9-_/]*)$ index.php?page=$1 [L]

aus index.php:
if (!empty($_GET['page'])) {
   $url = real_escape($_GET['page']);
   switch (substr_count($url , '/')) {
      case 0:
         $URL['page'] = $url;
         $URL['dir']  = '';
         break;
      case 1:
         $URL['page'] = substr($url, 0, stripos($url, '/'));
         $URL['dir']  = substr($url, stripos($url, '/')+1);
         break;
      default:
         #header('Location: /fehler.html');
         header("HTTP/1.0 404 Not Found");
         die();
         break;
   }
} else {
   $URL['page'] = 'index';
   $URL['dir']  = '';
}

Woran könnte das liegen?

Danke, luti

  1. Hi,

    Sind im übergebenen String mehr als ein Slash enthalten, möchte ich eine 404-Fehlermeldung ausgeben. Aber die wird anscheind nicht ausgrführt

    ich sehe in Deinem Code nichts, was diesen Effekt verursachen könnte. Nach meinem Dafürhalten müsste der Client ein leeres Dokument mit dem Status 404 erhalten.

    (ein "header('Location: /fehler.html');") funkioniert an dieser Stelle problemlos.

    Du meinst sicher "header('Location: http://example.com/fehler.html');". Der Location-Header *muss* eine absolute URL enthalten. Dies führt zu einem Status 301, der auf eine Seite umgeleitet wird, die mit Status 200 ausgeliefert wird, sofern das Dokument nichts anderes setzt.

    .htaccess:

    Die spielt für das Problem keine Rolle. Der Server hat bereits entschieden, wer sich um den Request kümmern soll, wenn Dein PHP-Script aufgerufen wird.

    Woran könnte das liegen?

    Woran könnte was genau liegen? Aus Deiner Problembeschreibung kann ich kein Problem erkennen, nur eine Tatsachenbehauptung, die ich für unwahr halte.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      danke für die ausführliche Antwort.

      Mh ... Also, wenn ich in die error.log meines Apache schaue, dann sehe ich dort keine entsprechende Fehlermeldung!

      Ich hatte ursprünglich folgendes gedacht (aber da lag ich wohl falsch): Ich sende einen 404-Header, der Server bricht ab und schaut wieder in die htaccess, was er damit machen soll. Aber auch wenn ich bei jeder x-beliebigen Seite erst mal einne 404 sende, wird die Seite normal angezeigt. Und wieder kein Log-Eintrag ...

      Wenn ich aber z.B. einen URL aufrufe, die nicht durch meine RewriteRule umgeleitet wird, (und nicht existiert) erhalte ich eine "not found or unable to stat" bzw. "File does not exist" Fehlermeldung im Log.

      Was ich eigentlich nur bezwecken will: Wenn eine aufgerufen Datei a) nicht der RewriteRule oder b) der Abfrage im Skipt entspricht (z.B. mehr als 1 Slash) -> sende eine Fehlermeldung und zeige eine spezielle Seite an. Wie mache ich das richtig?

      Du meinst sicher "header('Location: http://example.com/fehler.html');". Der Location-Header *muss* eine absolute URL enthalten.

      Stimmt, aber "manche Clients akzeptieren auch relative URIs" (bei mir der Fall ...). Werde ich ändern -> wirft eine neue Frage auf, dazu komme ich dann später.

      Dank & Grüße, luti