PHP header(Location: ...): 强制地址栏中的 URL 更改

2022-01-11 00:00:00 location header redirect php

我目前正在开发一个移动网站,该网站使用带有数据库的 PHP 会话进行身份验证.我有一个登录页面,其中包含提交时转到 server_login.php 的表单.然后 php 文件创建一些会话数据(存储在 $_SESSION 中),并将用户重定向回索引页面:

I'm currently working on a mobile site with authentication using PHP sessions with a database. I have a login page with a form that goes to server_login.php on submit. The php file then creates some session data (store in $_SESSION), and redirects the user back to the index page:

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

新网页(index.php)正确加载;但是,当header重定向页面时,地址栏的URL并没有改变;它停留在 *http://localhost/php/server/server_login.php* 而不是 http://localhost/index.php ,因此我所有其他使用相对路径的资源都不能被加载.就好像网页仍然认为它驻留在/php/server 而不是/.

The new web page (index.php) loads correctly; however, when the header redirects the page, the URL at the address bar is not changed; it stays at *http://localhost/php/server/server_login.php* instead of http://localhost/index.php and thus all my other resources that makes use of relative pathing could not be loaded. It's as if the web page still thinks that it resides at /php/server instead of /.

奇怪的是,我在 logout.php 中对 header("location: ...") 的其他使用可以通过 URL 更改成功地重定向页面.

Strangely, my other use of header("location: ...") at logout.php works and redirects the page successfully with a URL change.

我已经确保在头重定向之前我的 *server_login.php* 中没有输出(上面只是要检查的 mysql 调用),并且我也使用了 ob_start() 和 ob_end_flush().

I've made sure that there are no outputs in my *server_login.php* before the header redirect (above it are just mysql calls to check) and I've used ob_start() and ob_end_flush() too.

是否有任何方法可以强制更改地址栏上的 URL(从而有望解决相对路径问题)?还是我做错了什么?

Are there any methods of forcing the URL on the address bar to change (and thus hopefully fix the relative path problem)? Or am I doing something wrong?

P/S:我正在使用 jQuery Mobile.

P/S: I am using jQuery Mobile.

这是我的不更改 URL 的重定向代码:

Here's my code for the redirection that doesn't change the 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");

}

推荐答案

尝试改变:

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

header("Location: blabla")

相关文章