2011-09-19 30 views
39

Attualmente sto lavorando su un sito mobile con autenticazione utilizzando sessioni PHP con un database. Ho una pagina di accesso con un modulo che va a server_login.php su submit. Il file php crea quindi alcuni dati della sessione (memorizzare in $ _SESSION), e reindirizza l'utente alla pagina indice:Intestazione PHP (Posizione: ...): modifica forzata dell'URL nella barra degli indirizzi

header("location:../../index.php"); 

La nuova pagina web (index.php) carichi correttamente; tuttavia, quando l'intestazione reindirizza la pagina, l'URL nella barra degli indirizzi non viene modificato; rimane a * http: //localhost/php/server/server_login.php* anziché http: //localhost/index.php e quindi non è stato possibile caricare tutte le altre risorse che utilizzano il percorso relativo. È come se la pagina web continuasse a pensare che risieda in/php/server anziché in /.

Stranamente, il mio altro uso dell'intestazione ("posizione: ...") in logout.php funziona e reindirizza correttamente la pagina con una modifica dell'URL.

Mi sono assicurato che non ci siano uscite nel mio * server_login.php * prima del reindirizzamento dell'intestazione (sopra sono solo chiamate mysql da verificare) e ho usato anche ob_start() e ob_end_flush().

Esistono metodi per forzare la modifica dell'URL nella barra degli indirizzi (e quindi si spera che risolva il problema relativo del percorso)? O sto facendo qualcosa di sbagliato?

P/S: Sto utilizzando jQuery Mobile.

EDIT: Ecco il mio codice per il reindirizzamento che non cambia l'URL:

// some other stuff not shown 


$sql = "SELECT * FROM $user_table WHERE email = '$myemail' AND password = '$mypassword'"; 
$login_result = mysql_query($sql, $connection); 

$count = mysql_num_rows($login_result); 

if ($count == 1) { 

    // Successfully verified login information 

    session_start(); 

    if (!isset($_SESSION['is_logged_in'])) { 
     $_SESSION['is_logged_in'] = 1; 
    } 

    if (!isset($_SESSION['email'])) { 
     $_SESSION['email'] = $myemail; 
    } 
    if (!isset($_SESSION['password'])) { 
     $_SESSION['password'] = $mypassword; 
    } 

    // Register user's name and ID 
    if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id']))) { 
     $row = mysql_fetch_assoc($login_result); 
     $_SESSION['name'] = $row['name']; 
     $_SESSION['user_id'] = $row['user_id']; 
    } 

    header("Location: http://localhost:8080/meet2eat/index.php"); 

} else { 
    // Not logged in. Redirect back to login page 
    header("Location: http://localhost:8080/meet2eat/php/login.php?err=1"); 

} 
+1

puoi mostrare il codice su come pubblichi i dati? – xdazz

risposta

26

Beh, se il server invia un'intestazione reindirizzamento corretto, il browser redirect e quindi "cambia l'url". Potrebbe essere un problema di browser, quindi. Non so se ha qualcosa a che fare con esso, ma non si dovrebbe inviare un url relativo nell'intestazione della posizione ("HTTP/1.1 richiede un URI assoluto come argomento per» Posizione: incluso lo schema, il nome host e il percorso assoluto , ma alcuni clienti accettano URI relativi ", http://php.net/manual/en/function.header.php), e la 'location' deve essere in maiuscolo, come:.

header('Location: http://myhost.com/mypage.php'); 
+0

Capisco. Ho corretto il codice (come mostrato sopra), ma sto ancora ricevendo lo stesso errore URL. :/Ho cambiato in Autenticazione HTTP in quanto ho capito che è parte del mio requisito di incarico, ma sono ancora incuriosito da questo strano "bug". – vemoxy

+0

hai provato diversi browser per escludere un bug del browser? – schneck

+0

Nota il tipo di "catch-all" che è normale nella radice di WP .htacces: RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule. /index.php [L] Verifica (es.tramite logging) se ottieni DUE passaggi dopo il reindirizzamento, il tuo reindirizzamento intenzionale (ri-catturato da index.php) e un altro successivo che poi si sbagliano ... implementando un add_filter ('[pre_] option_siteurl | home'); do quadruple enforce the new place to be potrebbe aiutarti ... –

6

ho avuto lo stesso problema con la pubblicazione di un modulo. Quello che ho fatto è stato quello di spegnere i dati-ajax.

+0

Non sono sicuro del motivo per cui è stato votato, ha ragione. Deve avere a che fare con jquery mobile. http://stackoverflow.com/questions/8403242/php-header-and-jquery-mobile/8403345#8403345 – kackleyjm

+0

Aveva lo stesso problema. Devi solo aggiungere data-ajax sull'elemento che non richiede ajax (ad es. Un collegamento ) in modo che jQuery Mobile non interferisca con ... anche se non si trova in un blocco/modulo jQuery Mobile. – Andy

53

Provare a cambiare:

header("Location : blabla") 
       ^
       | 
      (whitespace) 

Per

header("Location: blabla") 
17

nel vostro elemento modulo aggiungere data-ajax="false". Ho avuto lo stesso problema con jquery mobile.

+0

Lo dimentico sempre quando uso jquery mobile! Ha funzionato per me;) – Bugdr0id

+0

Ho avuto lo stesso problema. Questo 'data-ajax = false' ha funzionato nel mio caso. – hyip

+0

ha funzionato per me. – merlin

-7

perché tutto questo indirizzo URL?

http://localhost:8080/meet2eat/index.php 

si può semplicemente usare

index.php 

se i file PHP sono nella stessa cartella e questo è meglio perché se si desidera ospitare i file o modificare la porta non si avrà alcun problema raggiungendo questo URL.

+1

Il fatto è che l'indice index.php non si trova nella stessa cartella. – icedwater

-3

si supponga di utilizzarlo come header(Location:../index.php) se in un'altra cartella

4

Non utilizzare qualsiasi spazio bianco. Ho avuto lo stesso problema. Quindi ho rimosso lo spazio bianco come:

header(location:index.php); 

Quindi ha funzionato.

1

Sei sicuro che la pagina che stai reindirizzando non abbia un reindirizzamento all'interno se non vengono trovati dati di sessione? Questo potrebbe essere il tuo problema

Inoltre si aggiunge sempre uno spazio come @Peter O suggerito.

0

ho avuto una soluzione per voi, Perché non si vuole usare esplodere se il vostro URL è qualcosa di simile

Url-> website.com/test/blog.php

$StringExplo=explode("/",$_SERVER['REQUEST_URI']); 
$HeadTo=$StringExplo[0]."/Index.php"; 
Header("Location: ".$HeadTo); 
-3

uso

intestazione ("Posizione: index.php"); // questo lavoro nel mio sito

maggiori informazioni su header() alla documentazione php.

+0

Le altre risposte indicano già che – Bowdzone

0

Basta cambiare casa a proprio piacimento

$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/home'; 

header('Location: ' . $home_url); 
1

// di registro il nome utente e l'ID

if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id']))) { 
    $row = mysql_fetch_assoc($login_result); 
    $_SESSION['name'] = $row['name']; 
    $_SESSION['user_id'] = $row['user_id']; 
} 

header("Location: http://localhost:8080/meet2eat/index.php"); 

modifica

nome di

// Registrazione utente e ID

if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id']))) { 
    $row = mysql_fetch_assoc($login_result); 
    $_SESSION['name'] = $row['name']; 
    $_SESSION['user_id'] = $row['user_id']; 
header("Location: http://localhost:8080/meet2eat/index.php"); 
} 
3

si consiglia di pu una pausa; dopo la vostra posizione:

header("HTTP/1.1 301 Moved Permanently"); 
header('Location: '. $YourArrayName["YourURL"] ); 
break; 
+0

È possibile combinare le prime 2 righe in una: intestazione ('Posizione:'. $ YourArrayName ["YourURL"], true, 301); – kurdtpage

0

come "cfphpflex" suggerito è possibile aggiungere break; dopo aver impostato l'intestazione. Puoi anche fare eco a qualcosa, ad esempio echo 'test';.

Problemi correlati