【问题标题】:PHP header(Location: ...): Force URL change in address barPHP header(Location: ...): 强制地址栏中的 URL 更改
【发布时间】:2011-11-20 00:09:51
【问题描述】:

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

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

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

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

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

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

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

编辑:这是我的不更改 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");

}

【问题讨论】:

  • 你能展示一下你如何发布数据的代码吗?

标签: php redirect header location


【解决方案1】:

尝试改变:

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

到

header("Location: blabla")

【讨论】:

    【解决方案2】:

    好吧,如果服务器发送了正确的重定向标头,浏览器会重定向并因此“更改 url”。那么可能是浏览器的问题。 我不知道它是否与它有关,但您不应该在位置标头中发送相对 url(“HTTP/1.1 需要绝对 URI 作为 » Location 的参数:包括方案、主机名和绝对路径,但有些客户端接受相对 URI。"、http://php.net/manual/en/function.header.php),并且 "location" 必须大写,例如:

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

    【讨论】:

    • 我明白了。我已经修复了代码(如上所示),但我仍然收到相同的 URL 错误。 :/ 我意识到这是我的分配要求的一部分,所以我已更改为 HTTP 身份验证,但我仍然对这个奇怪的“错误”很感兴趣。
    • 请注意 WP 根 .htacces 中常见的“包罗万象”: RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule 。 /index.php [L] 检查(即通过日志记录)如果您在重定向后获得两次通过,您的故意重定向(由 index.php 重新捕获)以及随后的另一个然后出错...实现一个add_filter('[pre_]option_siteurl|home');做四重强制新的地方可能会帮助你......
    • 根据 RFC 2616,HTTP 标头不区分大小写。 Location 标头不必大写。
    【解决方案3】:

    在您的表单元素中添加data-ajax="false"。我在使用 jquery mobile 时遇到了同样的问题。

    【讨论】:

    • 我在使用jquery mobile时总是忘记这一点!为我工作;)
    • 我遇到了同样的问题。这个data-ajax=false 对我有用。
    【解决方案4】:

    不要使用任何空格。我遇到过同样的问题。然后我删除了空格,例如:

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

    然后它起作用了。

    【讨论】:

      【解决方案5】:

      你可能想休息一下;在您的位置之后:

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

      【讨论】:

      • 可以将前两行合并为一行:header('Location:'.$YourArrayName["YourURL"], true, 301);
      【解决方案6】:

      我在发布表单时遇到了同样的问题。我所做的是关闭 data-ajax。

      【讨论】:

      【解决方案7】:

      如果没有找到会话数据,您确定要重定向的页面也没有重定向吗?那可能是你的问题

      当然,总是像@Peter O 建议的那样添加空格。

      【讨论】:

        【解决方案8】:

        我为你找到了解决方案,如果你的 url 是这样的,你为什么不使用 Explode 呢

        网址-> website.com/test/blog.php

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

        【讨论】:

          【解决方案9】:

          随心所欲地换个家

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

          【讨论】:

            【解决方案10】:

            //注册用户名和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");
            

            改成

            //注册用户名和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");
            }
            

            【讨论】:

              【解决方案11】:

              正如“cfphpflex”所建议的,您可以在设置标题后添加break;。你也可以回显一些东西,比如echo 'test';。

              【讨论】:

                【解决方案12】:

                在标题末尾添加退出然后它会起作用

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

                【讨论】:

                  【解决方案13】:

                  如果它在另一个文件夹中,你应该像 header(Location:../index.php) 一样使用它

                  【讨论】:

                    【解决方案14】:

                    使用

                    header("位置:index.php"); //这项工作在我的网站上

                    在 php 文档中阅读更多关于 header() 的信息。

                    【讨论】:

                      【解决方案15】:

                      为什么所有这些位置 url?

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

                      你可以使用

                      index.php
                      

                      如果 php 文件在同一个文件夹中,这样会更好,因为如果你想托管文件 或更改端口,您将毫无问题地访问此 URL。

                      【讨论】:

                      • 问题是,index.php 不在同一个文件夹中。
                      猜你喜欢
                      • 1970-01-01
                      • 2016-07-28
                      • 2014-03-29
                      • 2015-03-06
                      • 2021-04-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-04-04
                      相关资源
                      最近更新 更多