heiko: session / header / application problem

hi,

ich habe folgendes problem:
der inhalt einer DB wird bei klick auf link in excel ausgegeben...
in der datei, die das macht, wird überprüft, ob der user berechtigt ist und dann geht es los...alles funktioniert prima unter http unter https leider nicht (datei nicht gefunden)

wenn ich nur das session_start stehenlasse und dieabfrage herausnehme funktioniert es auch nicht... wenn ich sessio_start auch weglasse funktioniert es >>also liegt es an dem session_start!?

gibt es ein problem session zu starten und danach zu sagen jetzt kommt ein ander anwendungs-typ als php?

PHP:--------------------------------------------------------------------------------
session_start();
 if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
 {
 header("Location: ".$DOCUMENT_ROOT.$Home_URL."/index.php");
 }

$fileName ="DB-Inhalt".date('dmy');
header("Content-Type: application/vnd.ms-excel");
header("Content-Transfer-Encoding: base64\n");
header("Content-Disposition: attachment; filename="".$fileName.".xls"");

--------------------------------------------------------------------------------

wer hat eine idee das zu umgehen?

grüße und dank

  1. Hallo,

    alles funktioniert prima unter http unter https leider nicht (datei nicht gefunden)
     header("Location: ".$DOCUMENT_ROOT.$Home_URL."/index.php");

    RTFM.
    http://www.php.net/manual/de/function.header.php

    Dort steht ganz deutlich, dass gemaess HTTP/1.1 (RFC 2616)
    die URL bei einem Location-Header absolut sein muss, also
    inklusive Angabe des Schemas/Protokolls ("http://"
    bzw. "https://").

    Um festzustellen, ob HTTP oder HTTPS verwendet wird,
    d.h. um den Anfang der URL zu kriegen, kannst Du
    z.B. folgendes brauchen:
    $protokoll=($_SERVER['HTTPS']=="on") ? "https" : "http";

    Statt auf $DOCUMENT_ROOT solltest Du lieber auf
    $_SERVER['DOCUMENT_ROOT'] zugreifen.
    http://www.php.net/manual/de/reserved.variables.php#reserved.variables.server
    Dann funktioniert das Skript auch, wenn
    register_globals="off" ist.

    Gruesse,

    Thomas

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    1. Dort steht ganz deutlich, dass gemaess HTTP/1.1 (RFC 2616)
      die URL bei einem Location-Header absolut sein muss, also
      inklusive Angabe des Schemas/Protokolls ("http://"
      bzw. "https://").

      hallo thomas,
      vielen dank für die Tipps!!!

      hast du auch eine idee wieso der rest nicht funktioniert(also die excel-ausgabe)?

      (die if-abfrage wird ja hoffentlich gar nicht gebraucht, wen jeder sich brav eingeloggt hat :-))

      1. Hallo,

        hast du auch eine idee wieso der rest nicht funktioniert(also die excel-ausgabe)?

        Ich verstehe die Problembeschreibung nicht.
        "Funktioniert nicht" zaehlt nicht. ;-)

        Bitte beschreibe nochmal, was Du vorhast,
        was das Skript in welchem Fall ausgeben soll
        und was Du ggf. fuer Fehlermeldungen kriegst
        bzw. mit dem Browser siehst/nicht siehst.

        Was schickt das Skript denn als HTTP-Head?
        W3C HTTP Head Service: http://cgi.w3.org/cgi-bin/headers

        Gruesse,

        Thomas

        --
        Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
        Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
        Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
        1. Hallo,

          hast du auch eine idee wieso der rest nicht funktioniert(also die excel-ausgabe)?

          Ich verstehe die Problembeschreibung nicht.
          "Funktioniert nicht" zaehlt nicht. ;-)

          ok ich versuch es etwas detailierter (hat ein wenig gedauert)...

          in einem geschützten bereich kann man sich einloggen, um datenbankeinträge vorzunehmen(texte, kontakte etc. eingeben)
          den login überprüfe ich auf allen seiten mit session variablen und wenn jemand nicht eingeloggt ist wird er zum start geschickt...

          -------------
          session_start();
           if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
           {
           header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
           }
          -------------

          außerdem kann man auch seine einträge in excel öffnen (sprich es werden alle einträge des users aus der db rausgeholt und in ein excel-sheet eingetragen)
          dazu wird die export.php aufgerufen die so aussieht:

          ---------
          <?
          session_start();
           if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
           {
           header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
           }

          $fileName ="DB-Inhalt".date('dmy');
          header("Content-Type: application/vnd.ms-excel");
          header("Content-Transfer-Encoding: base64\n");
          header("Content-Disposition: attachment; filename="".$fileName.".xls"");
          ?><html>.....
          -----------

          wie gesagt das ganze funktioniert unter http
          (also es kommt ein pop-up mit Dateidownload "Einige Dateien..." Dateiname DB-Inhalt... ich klicke ok und die Datenbankdaten werden in einem excel-sheet angezeigt)

          unter https hingegen popt das fenster auf: Dateidownload ..und jetzt steht dateiname: export.php also nicht mal die variable "$fileName" wird erkannt... wenn ich auf ok klicke kommt eine warnmeldung export.php konnte nicht gefunden werden entweder....

          wenn ich nur das session_start stehenlasse und die if abfrage herausnehme funktioniert es auch nicht... wenn ich session_start auch weglasse funktioniert es >>also liegt es an dem session_start!?

          Was schickt das Skript denn als HTTP-Head?
          W3C HTTP Head Service: http://cgi.w3.org/cgi-bin/headers

          302 Found
          Content-Disposition: attachment; filename="DB-Inhalt 110304.xls"
          X-Powered-By: PHP/4.3.4
          Content-Transfer-Encoding: base64
          Set-Cookie: PHPSESSID=b82fb0ee48b243d6603a5f0ce3a8e890; path=/
          Expires: Thu, 19 Nov 1981 08:52:00 GMT
          Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8 Python/2.1.1 PHP/4.3.4 mod_perl/1.26 PHP-CGI/0.1b
          Connection: close
          Location: http://www.XXXXXXXXXXXXXXXXX/index.php
          Pragma: no-cache
          Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
          Date: Thu, 11 Mar 2004 16:53:58 GMT
          Content-Type: application/vnd.ms-excel

          200 OK
          Date: Thu, 11 Mar 2004 16:53:58 GMT
          Connection: close
          X-Powered-By: PHP/4.3.4
          Content-Type: text/html
          Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8 Python/2.1.1 PHP/4.3.4 mod_perl/1.26 PHP-CGI/0.1b

          Gruesse,

          Thomas

          auch nochmal beste grüße

          1. Hallo,

            Danke fuer die Beschreibung.

            außerdem kann man auch seine einträge in excel öffnen (sprich es werden alle einträge des users aus der db rausgeholt und in ein excel-sheet eingetragen)

            Was heisst das konkret?
            Schreibst Du eine "physische" Datei und laesst
            dann deren Inhalt durch die export.php "fliessen"?
            Oder sendet das Skript export.php die Daten direkt?

            In welchem Format? CSV?

            dazu wird die export.php aufgerufen die so aussieht:
            $fileName ="DB-Inhalt".date('dmy');

            Kleiner Tip: Zwecks Sortierbarkeit u.s.w. wuerde
            ich den Dateinamen eher in umgekehrter Reihenfolge
            aufbauen: ymd oder Ymd.

            header("Content-Type: application/vnd.ms-excel");
            header("Content-Transfer-Encoding: base64\n");
            header("Content-Disposition: attachment; filename="".$fileName.".xls"");
            ?><html>.....

            ^^^^^
            Was macht jetzt hier das <html>?
            Schickst Du etwa eine HTML-Seite, nachdem Du gesagt hast,
            jetzt kaeme eine Excel-Tabelle?
            (Kann sein, dass das geht. Kenne die HTML-Faehigkeiten
            von Excel nicht. ;-)

            Was schickst Du alles, d.h. worin besteht die
            eigentliche Ausgabe des Skripts?
            (Die ersten paar Zeilen duerften uns zum Verstaendnis reichen).

            unter https hingegen popt das fenster auf: Dateidownload ..und jetzt steht dateiname: export.php also nicht mal die variable "$fileName" wird erkannt... wenn ich auf ok klicke kommt eine warnmeldung export.php konnte nicht gefunden werden entweder....

            Ich kenne mich mit dem MS IE leider nicht aus, kann also
            nur mutmassen, warum er sich (aufgrund von Einstellungen)
            bei HTTP und HTTPS unterschiedlich verhaelt, z.B. dass er

            • keine Cookies akzeptiert,
            • keine 302-Weiterleitungen ausfuehrt
            • auf Vorschlaege (Content-... Header) anders/nicht reagiert
              Was weiss ich...

            wenn ich nur das session_start stehenlasse und die if abfrage herausnehme funktioniert es auch nicht... wenn ich session_start auch weglasse funktioniert es >>also liegt es an dem session_start!?

            Ich kann mir leider daraus keinen Reim machen.

            Was schickt das Skript denn als HTTP-Head?

            Ist der jetzt von dem Script, das die Ausgabe machen sollte,
            das Du oben export.php genannt hast?

            _Dessen_ HEAD waere interessant, und zwar, wenn es ueber
            HTTPS abgerufen wird.

            302 Found

            Also eine Umleitung.
            Dann duerften die darauf folgenden Content-Dingsbums Header
            _dieses_ Skripts nicht mehr interessant/zutreffend sein, sondern
            diejenigen des Skripts, auf das umgeleitet wird.

            => Ich vermute, Du solltest beim Fall, dass Du die Leute umleiten willst,
            nach dem Umleitungs-header() ein exit; einbauen.
            Steht uebrigens auch im Manual zu header()!

            if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
             {
             header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
             exit;
             }

            Ganz korrekt (nach HTTP/1.1) sollten uebrigens nach einem 30x-Head
            noch ein paar Zeilen HTML mit einem klickbaren Link zur
            neuen URL folgen.
            In Opera kann man Umleitungen ausschalten, dann wird
            ebendieses HTML dann angezeigt.
            Der Content-Type einer Umleitung waere dann also text/html.

            Content-Disposition: attachment; filename="DB-Inhalt 110304.xls"

            Wo kommt dieser Leerschlag her? ---------------------> ^

            Das folgende ist dann der Head der Seite, auf die
            Umgeleitet wird:

            200 OK

            [...]

            Content-Type: text/html
            Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8 Python/2.1.1 PHP/4.3.4 mod_perl/1.26 PHP-CGI/0.1b

            So, ich muss auf den Weg.
            Heute hoerst Du nicht mehr von mir. Morgen wieder.
            Hoffe, Du kommst weiter.

            Ach ja, das Tool von Schroeppl ist auch ganz praktisch.
            Damit kannst Du nicht nur den HEAD, sondern (wenn Du
            GET waehlst) auch die ersten paar Zeilen der eigentlichen
            Ausgabe des Skripts sehen.
            http://www.schroepl.net/cgi-bin/http_trace.pl

            HTH, mfg + gute Nacht
            Thomas

            1. Hallo,

              Danke fuer die Beschreibung.

              außerdem kann man auch seine einträge in excel öffnen (sprich es werden alle einträge des users aus der db rausgeholt und in ein excel-sheet eingetragen)

              Was heisst das konkret?
              Schreibst Du eine "physische" Datei und laesst
              dann deren Inhalt durch die export.php "fliessen"?
              Oder sendet das Skript export.php die Daten direkt?

              hm.. also das export.php bekommt ja folgenden header mitgeteilt
              header("Content-Type: application/vnd.ms-excel");

              der inhalt ist dann im prinzip eine html tabelle die durch php gefüllt wird

              In welchem Format? CSV?

              also html

              dazu wird die export.php aufgerufen die so aussieht:
              $fileName ="DB-Inhalt".date('dmy');
              Kleiner Tip: Zwecks Sortierbarkeit u.s.w. wuerde
              ich den Dateinamen eher in umgekehrter Reihenfolge
              aufbauen: ymd oder Ymd.

              ok, danke!

              header("Content-Type: application/vnd.ms-excel");
              header("Content-Transfer-Encoding: base64\n");
              header("Content-Disposition: attachment; filename="".$fileName.".xls"");
              ?><html>.....
                   ^^^^^
              Was macht jetzt hier das <html>?
              Schickst Du etwa eine HTML-Seite, nachdem Du gesagt hast,
              jetzt kaeme eine Excel-Tabelle?
              (Kann sein, dass das geht. Kenne die HTML-Faehigkeiten
              von Excel nicht. ;-)

              das klappt prima!

              Was schickst Du alles, d.h. worin besteht die
              eigentliche Ausgabe des Skripts?
              (Die ersten paar Zeilen duerften uns zum Verstaendnis reichen).

              wie gesagt dass ist im pur html...
              <html><head>
                 <meta http-equiv=Content-Type content="text/html; charset=windows-1252">
              <meta name=ProgId content=Excel.Sheet>
              <meta name=Generator content="Microsoft Excel 10">
              <!--[if gte mso 9]><xml>
               <o:DocumentProperties>
              ....
              excel-style und weiterer müll
              ....
              </head>
               <body><table border=1 cellpadding=2 cellspacing=0 bordercolor='#000000'><tr bgcolor='#FFCC00'>
                  <td> </td>
              ....

              unter https hingegen popt das fenster auf: Dateidownload ..und jetzt steht dateiname: export.php also nicht mal die variable "$fileName" wird erkannt... wenn ich auf ok klicke kommt eine warnmeldung export.php konnte nicht gefunden werden entweder....

              Ich kenne mich mit dem MS IE leider nicht aus, kann also
              nur mutmassen, warum er sich (aufgrund von Einstellungen)
              bei HTTP und HTTPS unterschiedlich verhaelt, z.B. dass er

              • keine Cookies akzeptiert,
              • keine 302-Weiterleitungen ausfuehrt
              • auf Vorschlaege (Content-... Header) anders/nicht reagiert
                Was weiss ich...

              wenn ich nur das session_start stehenlasse und die if abfrage herausnehme funktioniert es auch nicht... wenn ich session_start auch weglasse funktioniert es >>also liegt es an dem session_start!?

              Ich kann mir leider daraus keinen Reim machen.

              Was schickt das Skript denn als HTTP-Head?
              Ist der jetzt von dem Script, das die Ausgabe machen sollte,
              das Du oben export.php genannt hast?

              ich habe den beginn des scriptes kopiert...da ich bei dem tool doch keine usernamen und pw mit übergeben kann ...?!

              jetzt aber im https verzeichnis:

              An error occured I/O error: http error no host given
              302 Found
              X-Powered-By: PHP/4.3.4
              Set-Cookie: PHPSESSID=4b2fcc15ef6d77511874a70321f3d968; path=/
              Expires: Thu, 19 Nov 1981 08:52:00 GMT
              Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8 Python/2.1.1 PHP/4.3.4 mod_perl/1.26 PHP-CGI/0.1b
              Connection: close
              Location: http:///www/webXXX/html/XXX/index.php
              Pragma: no-cache
              Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
              Date: Fri, 12 Mar 2004 08:51:35 GMT
              Content-Type: text/html

              _Dessen_ HEAD waere interessant, und zwar, wenn es ueber
              HTTPS abgerufen wird.

              302 Found

              Also eine Umleitung.

              ja...aber nur weil ich doch die user-angaben nicht mit übergeben kann!!??? jetzt habe ich die if abfrage auskommentiert...

              200 OK
              Content-Disposition: attachment; filename="EMEA Forecast 120304.xls"
              X-Powered-By: PHP/4.3.4
              Content-Transfer-Encoding: base64
              Set-Cookie: PHPSESSID=844898699e226697301e7429efe769ff; path=/
              Expires: Thu, 19 Nov 1981 08:52:00 GMT
              Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8 Python/2.1.1 PHP/4.3.4 mod_perl/1.26 PHP-CGI/0.1b
              Connection: close
              Pragma: no-cache
              Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
              Date: Fri, 12 Mar 2004 08:53:49 GMT
              Content-Type: application/vnd.ms-excel

              Dann duerften die darauf folgenden Content-Dingsbums Header
              _dieses_ Skripts nicht mehr interessant/zutreffend sein, sondern
              diejenigen des Skripts, auf das umgeleitet wird.

              => Ich vermute, Du solltest beim Fall, dass Du die Leute umleiten willst,
              nach dem Umleitungs-header() ein exit; einbauen.
              Steht uebrigens auch im Manual zu header()!

              if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
               {
               header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
               exit;
               }

              Ganz korrekt (nach HTTP/1.1) sollten uebrigens nach einem 30x-Head
              noch ein paar Zeilen HTML mit einem klickbaren Link zur
              neuen URL folgen.
              In Opera kann man Umleitungen ausschalten, dann wird
              ebendieses HTML dann angezeigt.

              aber doch nur client seitig?! über header läuft das doch schon auf dem server ab, oder?!

              Der Content-Type einer Umleitung waere dann also text/html.

              Content-Disposition: attachment; filename="DB-Inhalt 110304.xls"
              Wo kommt dieser Leerschlag her? ---------------------> ^

              Das folgende ist dann der Head der Seite, auf die
              Umgeleitet wird:

              200 OK
              [...]
              Content-Type: text/html
              Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8 Python/2.1.1 PHP/4.3.4 mod_perl/1.26 PHP-CGI/0.1b

              So, ich muss auf den Weg.
              Heute hoerst Du nicht mehr von mir. Morgen wieder.
              Hoffe, Du kommst weiter.

              Ach ja, das Tool von Schroeppl ist auch ganz praktisch.
              Damit kannst Du nicht nur den HEAD, sondern (wenn Du
              GET waehlst) auch die ersten paar Zeilen der eigentlichen
              Ausgabe des Skripts sehen.
              http://www.schroepl.net/cgi-bin/http_trace.pl

              HTH, mfg + gute Nacht
              Thomas

              hast du vielleicht ne idee für nen ganz anderen ansatz?
              inhalt in eine temp. variable schreiben per header neue seite aufrufen, die die variable ausgibt und löscht?

              mir geht es darum dass die ausgabe nur von dem korrekt eingeloggten user vorgenommen werden kann...also ein anderer user nicht einfach export.php eingeben kann und ein ergenis bekommt..deshalb brauche ich die session_start...

              ohne session_start und if abfrage funzt es ja prima auch bei https...

              grüße und 1000 dank

              heiko

              1. Hallo Heiko,

                So, da bin ich wieder;-)

                Schickst Du etwa eine HTML-Seite, nachdem Du gesagt hast,
                jetzt kaeme eine Excel-Tabelle?

                das klappt prima!

                OK, alles klar.
                Du schickst also aehnliches Moechtegern-HTML, wie es Excel produziert,
                wenn man auf "Datei -> Speichern unter" geht und dann "HTML" als
                Export-Format waehlt, und Excel oeffnet dieses Dokument.

                ich habe den beginn des scriptes kopiert...da ich bei dem tool doch keine usernamen und pw mit übergeben kann ...?!

                Du koenntest ggf. die Session-ID eines erfolgreich "eingeloggten" Benutzers
                als URL-Parameter mitgeben.
                (Kommt auf die PHP-Konfiguration an, Stichwort session.use_only_cookies)

                Probier es zuerst mal selbst:
                https://www.example.com/.../export.php?PHPSESSID=xyz123abc456

                Die Session-ID kannst Du Dir ja von einem Script anzeigen lassen,
                sobald Du eingeloggt bist. Oder Du schaust halt in den Cookies nach,
                falls Du weisst oder herausfindest, wie das beim MS IE geht...

                An error occured I/O error: http error no host given

                Diese Meldung sagt mir leider nichts.

                Expires: Thu, 19 Nov 1981 08:52:00 GMT
                Pragma: no-cache
                Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

                Ich nehme mal an, dass Du fuer diese Angaben verantwortlich bist.
                Mein Apache/PHP schickt keinen solchen Kram...
                Versuch mal, sie wegzulassen.

                200 OK
                Content-Disposition: attachment; filename="EMEA Forecast 120304.xls"

                Auch hier hast Du wieder Leerzeichen im Dateinamen.
                Spielt vielleicht auch eine Rolle...

                => Ich vermute, Du solltest beim Fall, dass Du die Leute umleiten willst,
                nach dem Umleitungs-header() ein exit; einbauen.
                Steht uebrigens auch im Manual zu header()!

                if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
                {
                header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
                exit;
                }

                Erst, als ich offline und unterwegs war, kam mir folgendes in den Sinn:
                Ganz sauber waere eigentlich, das ganze mit if/else zu machen:

                if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
                  {
                   header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
                   /* Plus ggf. ein paar Zeilen HTML mit einem Link, siehe unten */
                  }
                else
                 {
                  /* Eigentliche Ausgabe */
                 }

                Ich weiss, dass der dclp-FAQ-Artikel "Waechter"
                http://www.dclp-faq.de/q/q-stil-waechter.html
                Deinen Schreibstil propagiert.

                Aber eben, wenn Du hier mit if/else arbeitest, und
                nicht mit nur mit if und exit, dann ist schonmal ganz
                eindeutig, welcher Fall zutrifft.

                Ganz korrekt (nach HTTP/1.1) sollten uebrigens nach einem 30x-Head
                noch ein paar Zeilen HTML mit einem klickbaren Link zur
                neuen URL folgen.
                In Opera kann man Umleitungen ausschalten, dann wird
                ebendieses HTML dann angezeigt.

                aber doch nur client seitig?! über header läuft das doch schon auf dem server ab, oder?!

                Ja, klar. Aber es erhoeht die Stabilitaet und Standard-Konformitaet,
                wenn Du Dich bezueglich "302 Found" an RFC 2616 haeltst:
                http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3
                  "Unless the request method was HEAD, the entity of the
                   response SHOULD contain a short hypertext note with
                   a hyperlink to the new URI(s)."

                Ich wuerde es etwa so machen:

                if (/* nicht eingeloggt/berechtigt */)
                  {
                   $zielurl="https://...";
                   header("Location: $zielurl");
                   echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n";
                   echo "<title>Umleitung</title>\n";
                   echo "<p>Umleitung: <a href='$zielurl'>Zur Loginseite</a>";
                  }
                else
                 { /* eigentliche Ausgabe */ }

                hast du vielleicht ne idee für nen ganz anderen ansatz?

                Ich wuerde versuchen, das Problem einzukreisen.

                Es scheint ja primaer etwas mit Sessions sowie mit
                dem Unterschied HTTPS/HTTP zu tun zu haben.

                Ich wuerde also mal als eigentliche Ausgabe
                etwas ganz einfaches nehmen, nicht gleich ein
                Excel-HTML-Dokument, sondern nur etwas Plain-Text:

                if (/* nicht eingeloggt/berechtigt */)
                  {
                   header("Location: $zielurl");
                   /* u.s.w. */
                  }
                else
                 { echo "Alles OK, Sie duerften die Daten sehen!";  }

                Auch die Bedingung solltest Du nochmals ueberpruefen.

                if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)

                Ist das wirklich das, was Du willst?
                Ich vermute, Du willst die Leute zulassen, die Login==true und Master==1 haben.

                Das koennte man z.B., wenn man etwas faul ist, so schreiben:

                if ($_SESSION['Login']=="true" AND $_SESSION["Master"]==1)
                  { /* Eigentliche Ausgabe */ }
                else
                  { /* Umleitung zur Login-Seite */ }

                Oder, wenn man die Umleitung als erstes (im IF-Teil) will,
                mit Negation der Bedingung:

                if (!($_SESSION['Login']=="true" AND $_SESSION["Master"]==1))
                  { /* Umleitung zur Login-Seite */ }
                else
                  { /* Eigentliche Ausgabe */ }

                Weil man dabei aber nicht prueft, ob die Variablen bzw. Schluessel
                ueberhaupt existieren, bevor man ihren Wert anschaut, ist diese
                Schreibweise nicht ganz korrekt.
                Bei scharf eingestellter Fehlerbehandlung gibt es so z.B. die Meldung
                Notice: Undefined index Login
                wenn $_SESSION['Login'] nicht definiert ist.

                Um ganz sauber zu sein, sollte man deshalb schreiben:

                if (!(isset($_SESSION['Login']) AND isset($_SESSION['Master']) AND $_SESSION['Login']=="true" AND $_SESSION["Master"]==1))
                  { /* Umleitung zur Login-Seite */ }
                else
                  { /* Eigentliche Ausgabe */ }

                Ein weiterer Punkt, den Du recherchieren bzw. ausprobieren
                koenntest, ist die Reihenfolge der verschiedenen HTTP-Content-Header,
                mit denen Du ja das Browserverhalten beeinflussen moechtest.

                Ich habe nur eine schwache Erinnerung, dass diese Reihenfolge
                evtl. beim MS IE eine Rolle spielt.
                Vielleicht findest Du dazu mehr...

                inhalt in eine temp. variable schreiben per header neue seite aufrufen, die die variable ausgibt und löscht?

                Ich glaube nicht, dass das etwas bringen wuerde.
                Es ist egal, woher das Skript die Daten hat, die es ausgibt.

                ohne session_start und if abfrage funzt es ja prima auch bei https...

                Daraus werde ich noch immer nicht schlau.

                Findet denn alles unter HTTPS statt?
                Also auch das Einloggen u.s.w.?

                Browser unterscheiden evtl. auch bezueglich Cookies u.s.w.
                zwischen https://www.example.com und http://www.example.com

                ---

                Du hast AFAIK noch gar nicht erwaehnt, welchen Browser
                Du verwendest.
                Falls es der MS IE ist - was ich irgendwie immer annahm - dann
                koenntest Du ja auch mal die Optionen durchforsten und schauen,
                ob es etwas aendert, wenn Du die Domain bzw. URL zu den
                "vertrauenswuerdigen" Seiten (oder wie das heisst) hinzufuegst.

                Sorry, irgendwie bin ich mit der ganzen Geschichte am Ende
                meines Lateins...

                Gruesse,

                Thomas

                --
                Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
                Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
                Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/