Andreas: header ("HTTP/1.0 403 Forbidden") erzeugt 500er?

Hallo!

Folgendes habe ich am Anfang meines PHP-Scriptes stehen:

if (!isset($_GET['a'])){
    header ("HTTP/1.0 401 Unauthorized");
 exit;
}
if (!isset($_GET['b'])){
    header ("HTTP/1.0 403 Forbidden");
 exit;
}

Das erzeugt aber einen 500er Fehler, genauer:

malformed header from script. Bad header=HTTP/1.0 403 Forbidden: /www/[...]

Was bedeutet das?

im Manual steht doch, das man z.B. auch header ("HTTP/1.0 404 Not Found"); so verwenden kann?! Habe zum testen auch extra die htaccess umbenannt!

Jemand ne Idee?

Viele Grüße
Andreas

  1. Hallo Andreas,

    header ("HTTP/1.0 401 Unauthorized");

    Diese Syntax funktioniert nur, wenn Du PHP als Apache-Modul verwendest.
    Da es bei Dir zu einer PHP-Fehlermeldung fuehrt, gehe ich davon aus, dass Du die CGI-Version verwendest.
    In diesem Fall funktioniert folgende Syntax (die auch bei der Modul-Version verwendbar ist):

    header('Status: 401 Unauthorized');

    Beste Gruesse

    Jan

    1. Hi!

      header('Status: 401 Unauthorized');

      Das hatte ich auch schon probiert, aber das wird schlicht ignoriert, und ja, ich habe die CGI-Version! Sowohl im IE als auch im Mozilla.

      Grüße
      Andreas

      1. Hi,

        header('Status: 401 Unauthorized');
        aber das wird schlicht ignoriert,

        von wem, und wie definierst Du "ignoriert"?

        Cheatah

        1. Hallo!

          header('Status: 401 Unauthorized');
          aber das wird schlicht ignoriert,

          von wem, und wie definierst Du "ignoriert"?

          Als erstes, in den Kommentaren des Manuals steht, das bei der Installation als CGI Version header("status: 403...") verwendet werden kann. Aber obwohl ich die CGI-Version habe, funktioniert das nicht.

          Wenn ich folgendes PHP-Script anlege:

          <?
          header('Status: 401 Unauthorized');
          echo "hallo";
          ?>

          Wenn ich deises Script über den Browser aufrufe, wird "Hallo" ausgegeben. Sonst nichts. Keine Weiterleitung, kein 401, kein gar nichts.

          Wenn ich jetzt noch ein exit(); dazwischen setze bleibt die Seite halt leer. Es sist so, als stünde die erste Zeile mit header() gar nicht da! header("location:...") funktioniert z.B. einwandfrei.

          PHP Version ist 4.1.2

          habe keinen Schimmer wieso!

          Grüße
          Andreas

          1. Hallo!

            Oder kann es sein das ich hier einem Denkfehler unterliege?

            Was ich will ist, wenn ich header ("HTTP/1.0 403 Forbidden") aufrufe, das automatisch - wie bei header("location:...) - auf die 403 Errorseite weitergelteitet wird, oder besser gesagt, das wie bei einem echten 403 an Stelle des angeforderten Dokuments direkt die Fehlerseite - mit status-Code - ausgegegen wird. Das passiert aber nicht.

            Kann es sein das ich manuell per location header auf die Fehlerseite leiten muß und den 403 dort erzeugen muß?

            Was macht php genau mit der header ("HTTP/1.0 403 Forbidden") Anweisung? Ist die vielleicht nur zu Dokumentationszwecken für die Apache-Logs? Aber ich will nunmal einen echten 403 Fehler auslösen, den auch der Client mitbekommt. ein  header ("Location: /403.htm") kann es doch nicht sein! Außerdem sind die Statuscodes ja gerade für http gedacht, also für die Kommunikation zwischen Apache und Browser, nicht für die "direkte" Kommunikation zwischen PHP und Apache! Bin etwas ratlos!

            Grüße
            Andreas

      2. Hallo Andreas,

        Das hatte ich auch schon probiert, aber das wird schlicht ignoriert, und ja, ich habe die CGI-Version! Sowohl im IE als auch im Mozilla.

        Ich denke, Du moechtest eine HTTP-Authentifizierung mittels PHP erreichen, richtig?
        In dem Fall schau Dir mal das Beispiel im PHP-Manual an:
         http://www.php.net/manual/de/features.http-auth.php,
        beachte dabei aber, "header('HTTP/1.0[...])" wiederum durch "header(Status:[...])" zu ersetzen.

        Beste Gruesse

        Jan

        1. Hi,

          Ich denke, Du moechtest eine HTTP-Authentifizierung mittels PHP erreichen, richtig?

          wenn dem so ist: AFAIK geht das ausschließlich bei der Installation von PHP als Server-Modul.

          Cheatah

          1. Hallo Cheatah,

            wenn dem so ist: AFAIK geht das ausschließlich bei der Installation von PHP als Server-Modul.

            Richtig, steht ja auch so auf besagter Seite im Manual. Erst denken, dann posten - Schande ueber mich ;-)

            In dem Fall bleibt nur die Authentifizierung mittels .htaccess oder eine eigene Login-Loesung.

            Beste Gruesse

            Jan

            1. Hi Jan!

              wenn dem so ist: AFAIK geht das ausschließlich bei der Installation von PHP als Server-Modul.

              Richtig, steht ja auch so auf besagter Seite im Manual. Erst denken, dann posten - Schande ueber mich ;-)

              In dem Fall bleibt nur die Authentifizierung mittels .htaccess oder eine eigene Login-Loesung.

              Mit geht es mehr um da Prinzip, ich will kein direkte Authentifizierung über das Authentifizierungs-Fenster erreichen, ich will eine Authentifizierung über eine Art SessionID im Link erreichen, das heißt wenn die SessionID nicht erwartet wird, bekommt er den entsprechenden header. dieser Mechanismus ist aber nicht das Problem(ob das Sinnvoll ist oder nicht soll jetzt nicht hier diskutiert werden), es geht mir nur darum überhaupt HTTP-statuscodes mit php senden zu können.

              Dasselbe Problem tritt auch bei header("status: 404 not Found"); auf.   Und eigentlich sollte es ja gehen, daher mein Posting!

              Grüße
              Andreas

              1. Hallo Andreas,

                [...] es geht mir nur darum überhaupt HTTP-statuscodes mit php senden zu können.

                Dasselbe Problem tritt auch bei header("status: 404 not Found"); auf.   Und eigentlich sollte es ja gehen, daher mein Posting!

                Du sendest bereits die richtigen HTTP-Header, und der Client empfaengt sie auch. Da der Client jedoch nicht die Apache-Fehlerseiten "eingebaut" hat, werden diese auch nicht angezeigt.
                Du kannst nach den Headern eigene Fehlermeldungen ausgeben, die den User darauf hinweisen, was passiert ist bzw. welcher HTTP-Fehler aufgetreten ist.

                Beste Gruesse

                Jan