Cabeçalho do PHP (localização:...): forçar a alteração do URL na barra de endereços
estou a trabalhar num site móvel com autenticação usando sessões de PHP com uma base de dados. Eu tenho uma página de login com um formulário que vai para server_login.php ao submeter. O ficheiro php cria então alguns dados de sessão (guardar em $_SESSION), e redirecciona o utilizador de volta para a página de índice:
header("location:../../index.php");
a nova página web (índice.php) carrega correctamente; contudo, quando o cabeçalho redirecciona a página, o URL na barra de endereços não é alterado; permanece em *http://localhost/php/server/server_login.php * em vez de http://localhost/index.php e, portanto, todos os meus outros recursos que fazem uso da localização relativa não puderam ser carregados. É como se a página web ainda pensa que reside em /php/server em vez de /.
estranhamente, o meu outro uso do cabeçalho ("localização: ...") no logout.o php funciona e redireciona a página com sucesso com uma mudança de URL.
certifiquei-me de que não há saídas na minha *server_login.php * antes do cabeçalho redireccionar (acima são apenas chamadas mysql para verificar) e eu usei ob_start () e ob_end_flush () também.
Existem alguns métodos de forçar a URL na barra de endereços a mudar (e assim espero corrigir o problema do caminho relativo)? Ou estou a fazer algo de errado?
P/S: estou a usar o telemóvel jQuery.
editar: aqui está o meu código para o redireccionamento que não altera o 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");
}
14 answers
Tenta mudar:
header("Location : blabla")
^
|
(whitespace)
A
header("Location: blabla")
Bem, se o servidor enviar um cabeçalho de redirecionamento correto, o navegador redireciona e, portanto, "muda a url". Pode ser um problema de navegador, então. Não sei se tem alguma coisa a ver com isso, mas você não deve enviar um url relativo no cabeçalho da localização ("HTTP/1.1 requer um URI absoluto como argumento para" localização: incluindo o esquema, o nome da máquina e o caminho absoluto, mas alguns clientes aceitam URIs relativos. ", http://php.net/manual/en/function.header.php ), e" localização " deve ser capitalizado, como:
header('Location: http://myhost.com/mypage.php');
Na sua forma, adicione data-ajax="false"
. Eu tive o mesmo problema usando jQuery mobile.
Não utilize nenhum espaço em branco. Eu tinha o mesmo problema. Depois removi o espaço branco como:
header(location:index.php);
Então funcionou.
Você pode querer fazer uma pausa; depois da sua localização:
header("HTTP/1.1 301 Moved Permanently");
header('Location: '. $YourArrayName["YourURL"] );
break;
Tem a certeza que a página que está a redireccionar também não tem uma redirecção dentro dela se não forem encontrados dados de sessão? Esse pode ser o teu problema.
Também sim adiciona sempre espaços em branco como o @Peter O sugeriu.
/ / 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");
Alteração para
/ / 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");
}
Tenho uma solução para ti, porque é que não preferes usar o Explode se a tua url for algo como
Url - > website.com/test/blog.php
$StringExplo=explode("/",$_SERVER['REQUEST_URI']);
$HeadTo=$StringExplo[0]."/Index.php";
Header("Location: ".$HeadTo);
$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/home';
header('Location: ' . $home_url);
Como o" cfphpflex " sugeriu, pode adicionar break;
depois de definir o cabeçalho. Você também pode ecoar algo, como echo 'test';
.
É suposto usá - lo como header(Location:../index.php)
se estiver noutra pasta
Utilizar
Cabeçalho ("localização: índice.php"); / / este trabalho no meu site
Leia mais no cabeçalho () na documentação do php.
Porquê toda esta url de localização?
http://localhost:8080/meet2eat/index.php
Pode apenas usar
index.php
Se os ficheiros php estão na mesma pasta e isto é melhor porque se quiser apresentar os ficheiros ou alterar o porto você não terá nenhum problema em alcançar este URL.