phil: header location problem

Hallo.

Mein header-redirect leitet nicht weiter, es wird einfach eine weiße Seite angezeigt:

// Cookie setzen  
setcookie(self::$cookiename, $key, $time,'/','', false, true);  
if($x==true){  
  // Session setzen  
  $_SESSION['auth_logged']	=true;  
  $_SESSION['auth_userid']	=$result[0]['uid'];  
  $_SESSION['auth_loginname']	=$result[0]['loginname'];  
  // Weiterleiten  
  header("Location: http://example.com/para1/para2/para3");  
  exit();  
}

Ich verstehe aber überhaupt nicht warum.
Der Pfad ist richtig! Wenn ich ihn so in die Adressleiste eingebe dann funktioniert er.

Nein - vor dem header wird _kein_ HTML o.ä. ausgegeben.
Ja - ich habe: error_reporting((E_ALL | E_STRICT)); an.
Nein - ich bekomme keine Fehlermeldung.
Ja - Ich verzweifel!

Ich habe auch schon versucht unmittelbar vor header() etwas auszugeben, das klappt, d.h. an dem $x liegt es nicht! An setcookie wohl auch nicht.

Bitte helft mir.

Liebe Grüße,phil

  1. Hi,

    Mein header-redirect leitet nicht weiter, es wird einfach eine weiße Seite angezeigt:

    Dann untersuche den HTTP-Datenverkehr, bspw. mit Firebug, um brauchbarere Infos zu bekommen, als "eine weiße Seite".

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Dann untersuche den HTTP-Datenverkehr, bspw. mit Firebug, um brauchbarere Infos zu bekommen, als "eine weiße Seite".

      ALso ich hab Live HTTP Headers.
      Ich sehe da nichts unnormales:

      http://example.com/Login/Formular

      POST /Auth/Login HTTP/1.1
      Host: example.com
      User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      Accept-Language: de-de,de;q=0.8,en-us;q=0.5,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
      Referer: http://example.com/
      Cookie: PHPSESSID=1d6c966a70778e6dba4d3c920e81622d; __utma=266937500.1663667665.1253201419.1253201419.1253218060.2; __utmc=266937500; __utmz=266937500.1253201419.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=266937500.7.10.1253218060
      Content-Type: application/x-www-form-urlencoded
      Content-Length: 49
      loginName=test&loginPw=test&ref=%2F&Login=Login
      HTTP/1.x 200 OK
      Date: Thu, 17 Sep 2009 20:15:01 GMT
      Server: Apache/2.2.9 (Debian)
      X-UD-Host: webspace.udag.de
      X-UD-Method: urlhiding
      X-UD-Target: http://example.com/
      X-UD-Loopcounter: 2
      X-UD-REMOTE_ADDR: 91.57.204.14
      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
      Set-Cookie: USERAUTH=c522e1c1aeefcace6671f16d96aaded0; path=/; httponly
      Content-Encoding: gzip
      Content-Length: 20
      Keep-Alive: timeout=15, max=97
      Connection: Keep-Alive
      Content-Type: text/html; charset=utf-8

      Grüße, phil

      1. Moin!

        Dann untersuche den HTTP-Datenverkehr, bspw. mit Firebug, um brauchbarere Infos zu bekommen, als "eine weiße Seite".

        ALso ich hab Live HTTP Headers.
        Ich sehe da nichts unnormales:

        Ich sehe da nichts redirecten.

        HTTP/1.x 200 OK
        Date: Thu, 17 Sep 2009 20:15:01 GMT
        Server: Apache/2.2.9 (Debian)
        X-UD-Host: webspace.udag.de
        X-UD-Method: urlhiding
        X-UD-Target: http://example.com/
        X-UD-Loopcounter: 2
        X-UD-REMOTE_ADDR: 91.57.204.14
        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
        Set-Cookie: USERAUTH=c522e1c1aeefcace6671f16d96aaded0; path=/; httponly
        Content-Encoding: gzip
        Content-Length: 20
        Keep-Alive: timeout=15, max=97
        Connection: Keep-Alive
        Content-Type: text/html; charset=utf-8

        - Sven Rautenberg

        1. Hi.

          Ich sehe da nichts redirecten.

          Also das ist megakomisch.
          Wenn ich direkt vorm header() - echo "x" oder so mache dann wirds ausgegeben. Also er kommt bis dahin aber er macht den Redirect nicht. Woran kann das denn liegen Mensch?

          1. Hi.

            Ich sehe da nichts redirecten.

            Also das ist megakomisch.
            Wenn ich direkt vorm header() - echo "x" oder so mache dann wirds ausgegeben. Also er kommt bis dahin aber er macht den Redirect nicht. Woran kann das denn liegen Mensch?

            Sven hats doch schon gesagt: da ist kein redirect. Ich sehe übrigens auch ohne Brille einen Status: 200 OK in Deinem Trace.

            Hotte

            --
            Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
            1. Sven hats doch schon gesagt: da ist kein redirect. Ich sehe übrigens auch ohne Brille einen Status: 200 OK in Deinem Trace.

              Aber woran lieegt das? was mache ich falsch?? Ich habe doch header("Location: ..."); richtig angegeben oder?

              1. Hallo Phil,

                Sven hats doch schon gesagt: da ist kein redirect. Ich sehe übrigens auch ohne Brille einen Status: 200 OK in Deinem Trace.
                Aber woran lieegt das? was mache ich falsch?? Ich habe doch header("Location: ..."); richtig angegeben oder?

                Du überschreibst den HTTP-Status an keiner Stelle.

                header("Location: http://example.com/para1/para2/para3",true,$http_status_code);

                Wo kann man sich denn das gesamte Script ansehen? Welche PHP-Version auf welchem Betriebssystem oder auch Windows nutzt Du?

                Gruß aus Berlin!
                eddi

                --
                Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
                1. Moin!

                  Aber woran lieegt das? was mache ich falsch?? Ich habe doch header("Location: ..."); richtig angegeben oder?

                  Du überschreibst den HTTP-Status an keiner Stelle.

                  Das macht PHP normalerweise automatisch.

                  header("Location: http://example.com/para1/para2/para3",true,$http_status_code);

                  So aufwendig schreibe auch ich meine Redirects nicht. Die volle URL ist klar, aber alles andere ist wirklich optional - im Allgemeinen jedenfalls.

                  Wo kann man sich denn das gesamte Script ansehen? Welche PHP-Version auf welchem Betriebssystem oder auch Windows nutzt Du?

                  Es ist halt nicht auszuschließen, dass irgendeine weitere Ausgabe hier interferiert.

                  Also erstmal den Banal-Fall herstellen: Das einzelne Redirect kopiert in einem neuen Skript funktioniert?

                  - Sven Rautenberg

                  1. Hallo Sven,

                    Aber woran lieegt das? was mache ich falsch?? Ich habe doch header("Location: ..."); richtig angegeben oder?
                    Du überschreibst den HTTP-Status an keiner Stelle.
                    Das macht PHP normalerweise automatisch.

                    PHP kann nicht von alleine entscheiden, ob es sich um eine temporäre (302, 307) oder permanente (301) Umleitung geht.

                    header("Location: http://example.com/para1/para2/para3",true,$http_status_code);
                    So aufwendig schreibe auch ich meine Redirects nicht. Die volle URL ist klar, aber alles andere ist wirklich optional - im Allgemeinen jedenfalls.

                    Wie du selbst unten feststellst, kann es immer mal zu "Interferenzen" einzelner Ausgaben kommen. Dafür gibt es, was die HTTP-Header anbelangt, aber den zweiten Parameter. Der dritte Parameter macht ein Script auch noch portabel. Zwischen dem Setzen des Statuscodes bei einem (Fast)CGI-Version zum Apachemodul kann es zu unterschieden durch Konfiguration kommen.

                    Gruß aus Berlin!
                    eddi

                    --
                    Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
                    1. Hi,

                      Aber woran lieegt das? was mache ich falsch?? Ich habe doch header("Location: ..."); richtig angegeben oder?
                      Du überschreibst den HTTP-Status an keiner Stelle.
                      Das macht PHP normalerweise automatisch.

                      PHP kann nicht von alleine entscheiden, ob es sich um eine temporäre (302, 307) oder permanente (301) Umleitung geht.

                      Wenn du nichts anderes angibst, dann macht PHP automatisch einen 302 draus.

                      http://www.php.net/manual/en/function.header.php:
                      The second special case is the "Location:" header. Not only does it send this header back to the browser, but it also returns a REDIRECT (302) status code to the browser unless some 3xx status code has already been set.

                      MfG ChrisB

                      --
                      Light travels faster than sound - that's why most people appear bright until you hear them speak.
                  2. Also erstmal den Banal-Fall herstellen: Das einzelne Redirect kopiert in einem neuen Skript funktioniert?

                    Schon längst getan ;).
                    Es geht. Aber in dem Skript halt nicht.

                2. Wisst ihr was das komischste ist?
                  Auf dem Webspace(bplaced) klappt es nicht - localhost schon.

                  =/!

                  1. Re:

                    Wisst ihr was das komischste ist?
                    Auf dem Webspace(bplaced) klappt es nicht - localhost schon.

                    bplaced.net hat einen flotten Support. Stelle dort Deine Frage und wenn sie nach Code fragen, zeige Dich kooperativer als hier!

                    Gruß aus Berlin!
                    eddi

                    --
                    Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
                    1. Hi.

                      public function Login()  
                      	{  
                      		// Falls Benutzername UND Passwort eingegeben wurden  
                      		if(isset($_POST['loginName']) && isset($_POST['loginName']))  
                      		{  
                      			// Anzahl der Versuche, maximal X  
                      			if (!isset($_SESSION['try'])) {  
                      				$_SESSION['try']=1;  
                      			} elseif($_SESSION['try']>$this->max_trys) {  
                      				#tools::goTo("Auth/Passwort_vergessen","",true);  
                      			} else {  
                      				++$_SESSION["try"];  
                      			}  
                      			$model=new Models_Auth();  
                      			if($result=$model->checkUser())  
                      			{  
                      				// Zufalls Key  
                      				$key=md5(rand(0,99).self::$thekey.uniqid(rand(), true));  
                      				// Zeit des Cookies auf "Nur-für-diese-Sitzung" setzen  
                      				$time=0;  
                      				// für immer eingeloggt bleiben?  
                      				if(isset($_POST['alwaysLogged'])){  
                      					$time=time()+321408000; # 10 Jahre  
                      				}  
                      				// Cookie setzen  
                      				setcookie(self::$cookiename, $key, $time,'/','', false, true);  
                      				// Sitzung eintragen in die DB  
                      				$setSession=$model->insertSession($result[0]['uid'],$result[0]['loginname'],$key);  
                      				if($setSession[0]==true){  
                      					// Session setzen  
                      					$_SESSION['auth_logged']	=true;  
                      					$_SESSION['auth_userid']	=$result[0]['uid'];  
                      					$_SESSION['auth_loginname']	=$result[0]['loginname'];  
                      					// Weiterleiten  
                      					header("Location: http://example.com/para1/para2/para3");  
                      					exit();  
                      				}  
                      				$_SESSION['auth_userid']=0;  
                      				// Falls erstellen einer Session nicht klappt  
                      				tools::goNext("/Auth/show/Check/Login/false");  
                      			} else {  
                      				$_SESSION['auth_userid']=0;  
                      				tools::goNext("/Auth/show/Check/Login/false");  
                      			}  
                      		} else { // Falls Benutzername oder Passwort NICHT eingegeben wurden  
                      			$_SESSION['auth_userid']=0;  
                      			return false;  
                      		}  
                      	}
                      

                      Da wo der Header-Redirect ist sollte eigentl. auch tools::goNext stehen welche so aussieht:

                      public static function goNext($goto, $done=true, $homeuri=true){  
                      header("Location: ".(($homeuri===true)?'http://expample.com/':"").ltrim($goto,"/"));exit();  
                      	}
                      

                      Die weiteren gefragten Methoden aus dem "Model":

                      public function checkUser()  
                      	{  
                      		// Falls ein "@" im Loginnamen ist, handelt es sich um eine E-Mail  
                      		if(strpos($_POST['loginName'],'@')){  
                      			if(!$r=db::db_query("SELECT uid,loginname FROM t1.users WHERE email='".db::escape($_POST['loginName'])."'AND pw='".$this->cryptIt($_POST['loginPw'])."' AND regdone='1'")){  
                      					// Falls es bei den E-Mails kein Ergebnis gab, nochmal User probieren  
                      					$r=db::db_query("SELECT uid, loginname FROM t1.users WHERE loginname='".db::escape($_POST['loginName'])."'AND pw='".$this->cryptIt($_POST['loginPw'])."' AND regdone='1'");  
                      			}  
                      		} else {// Falls es sich um einen Usernamen (ohne "@") handelt..  
                      			$r=db::db_query("SELECT uid, loginname FROM t1.users WHERE loginname='".db::escape($_POST['loginName'])."'AND pw='".$this->cryptIt($_POST['loginPw'])."' AND regdone='1'");  
                      		}  
                      		return $r;  
                      			  
                      	}  
                        
                        
                      	/**  
                      	* Trägt neue Login-Session ein  
                      	*/  
                      	public function insertSession($userid,$username,$sessionkey){  
                      		return db::db_query("INSERT INTO t1.users_sessions (userid, loginname, login_key) VALUES ('".$userid."','".$username."','".$sessionkey."')");  
                      	}
                      

                      Nicht wundern bei den Queries, was da vor den Tabellennamen steht ist der Name des Schemas (ich nutze PostGreSQL 8.4). Ich nutze PHP 5.3 + Apache.

                      Hoffe das sind genügend Infos.
                      Gruß, phil

                      1. re:

                        public function Login()

                        {
                        // Falls Benutzername UND Passwort eingegeben wurden
                        if(isset($_POST['loginName']) && isset($_POST['loginName']))
                        {
                        // Anzahl der Versuche, maximal X

                        bplaced ermöglicht Konfiguration mittels php.ini  
                        hast Du dort "session.auto\_start=1" drin?  
                        
                        > 			~~~php
                        
                        if (!isset($_SESSION['try'])) {  
                        
                        > 				$_SESSION['try']=1;  
                        > 			} elseif($_SESSION['try']>$this->max_trys) {  
                        > 				#tools::goTo("Auth/Passwort_vergessen","",true);  
                        > 			} else {  
                        > 				++$_SESSION["try"];  
                        > 			}  
                        > 			$model=new Models_Auth();  
                        > 			if($result=$model->checkUser())  
                        > 			{  
                        > 				// Zufalls Key  
                        > 				$key=md5(rand(0,99).self::$thekey.uniqid(rand(), true));  
                        > 				// Zeit des Cookies auf "Nur-für-diese-Sitzung" setzen  
                        > 				$time=0;  
                        > 				// für immer eingeloggt bleiben?  
                        > 				if(isset($_POST['alwaysLogged'])){  
                        > 					$time=time()+321408000; # 10 Jahre  
                        > 				}  
                        > 				// Cookie setzen  
                        > 				setcookie(self::$cookiename, $key, $time,'/','', false, true);
                        
                        

                        das alles macht Das Modul durch session.use_cookies automatisch.

                          		~~~php
                        

                        // Sitzung eintragen in die DB

                          		$setSession=$model->insertSession($result[0]['uid'],$result[0]['loginname'],$key);
                        
                        was gibt var\_dump($setSession) aus?  
                        mal über den Gebrauch von [session.save_handler](http://de2.php.net/manual/de/session.configuration.php#ini.session.save-handler) nachgedacht?  
                          
                          
                        Gruß aus Berlin!  
                        eddi
                        
                        -- 
                        Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
                        
                        1. Hi.

                          Ich habe mir zwar das hier schon durchgelesen - checke aber nich wirklich was ich davon habe und wie ich es bei mir anwende. Wobei ersteres das größere Problem ist.

                          Gruß, Phil

              2. Sven hats doch schon gesagt: da ist kein redirect. Ich sehe übrigens auch ohne Brille einen Status: 200 OK in Deinem Trace.

                Aber woran lieegt das? was mache ich falsch?? Ich habe doch header("Location: ..."); richtig angegeben oder?

                Ja, schon. Aber irgendwas scheint ja vorher ausgegeben zu werden, prüf das mal. Z.B. die Funktionen wo Du aufrufst, nicht dass die ne Fehlermeldung rausbrüllen und Dir damit die Tour mit der Umleitung vermasseln.

                Hotte

                --
                Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.