web-dev-qa-db-fra.com

PHP en-tête (emplacement: ...): Forcer le changement d'URL dans la barre d'adresse

Je travaille actuellement sur un site mobile avec une authentification utilisant PHP sessions avec une base de données. J'ai une page de connexion avec un formulaire qui va à server_login.php sur submit. Le fichier php crée ensuite des données de session (stockées dans $ _SESSION), et redirige l'utilisateur vers la page d'index:

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

La nouvelle page Web (index.php) est chargée correctement. Toutefois, lorsque l'en-tête redirige la page, l'URL dans la barre d'adresse n'est pas modifiée. il reste à * http: //localhost/php/server/server_login.php* au lieu de http: //localhost/index.php et ainsi de suite mes autres ressources utilisant le chemin relatif ne peuvent pas être chargées. C'est comme si la page Web pensait toujours qu'elle résidait dans/php/server au lieu de /.

Étrangement, mon autre utilisation d'en-tête ("location: ...") sur logout.php fonctionne et redirige la page avec succès avec un changement d'URL.

Je me suis assuré qu'il n'y avait pas de sorties dans mon * server_login.php * avant la redirection de l'en-tête (au-dessus, ce ne sont que des appels mysql à vérifier) ​​et j'ai aussi utilisé ob_start () et ob_end_flush ().

Existe-t-il des méthodes pour forcer l'URL de la barre d'adresse à changer (et donc, espérons-le, à résoudre le problème du chemin relatif)? Ou est-ce que je fais quelque chose de mal?

P/S: J'utilise jQuery Mobile.

EDIT: Voici mon code pour la redirection qui ne change pas 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");

}
55
vemoxy

Essayez de changer:

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

À

header("Location: blabla")
64
BuraCULa

Eh bien, si le serveur envoie un en-tête de redirection correct, le navigateur redirige et donc "modifie l'URL". Ce pourrait être un problème de navigateur, alors. Je ne sais pas si cela a quelque chose à voir avec cela, mais vous ne devriez pas envoyer d'URL relative dans l'en-tête d'emplacement ("HTTP/1.1 requiert un URI absolu comme argument pour" Emplacement: comprenant le schéma, le nom d'hôte et le chemin absolu, mais certains clients acceptent les URI relatifs. ", http://php.net/manual/en/function.header.php ), et" emplacement "doit être mis en majuscule, comme suit:

header('Location: http://myhost.com/mypage.php');
31
schneck

Dans votre élément de formulaire, ajoutez data-ajax="false". J'ai eu le même problème en utilisant jquery mobile.

17
kackleyjm

J'ai eu le même problème avec l'envoi d'un formulaire. Ce que j'ai fait, c'est éteindre le data-ajax.

6
Hadi

vous voudrez peut-être mettre une pause; après votre emplacement:

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

N'utilisez aucun espace blanc. J'ai eu le même problème. Puis j'ai supprimé les espaces blancs comme:

header("location:index.php"); or header('location:index.php');

Ensuite cela a fonctionné.

5
Hasib Omi

// Enregistrer le nom et l'identifiant de l'utilisateur

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");

changer à

// Enregistrer le nom et l'identifiant de l'utilisateur

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");
}
1
GULIM SHAH

Êtes-vous sûr que la page que vous redirigez n'a pas de redirection si aucune donnée de session n'est trouvée? Ça pourrait être ton problème

Aussi, oui, ajoutez toujours des espaces, comme suggéré par @Peter O.

1
Joe Barbour

Comme "cfphpflex" l'a suggéré, vous pouvez ajouter break; après avoir défini l'en-tête. Vous pouvez également faire écho à quelque chose, tel que echo 'test';.

1
shlgug

J'ai une solution pour vous, pourquoi ne pas utiliser plutôt Explode si votre URL est quelque chose comme

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

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

Il suffit de changer de maison à votre goût

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

header('Location: ' . $home_url);
0
aary trivedi