PHP标题(位置:…):强制更改地址栏中的URL

PHP标题(位置:…):强制更改地址栏中的URL,php,redirect,header,location,Php,Redirect,Header,Location,我目前正在一个移动站点上工作,该站点使用带有数据库的PHP会话进行身份验证。 我有一个登录页面,表单在提交时转到server\u login.php。然后,php文件创建一些会话数据(存储在$_session中),并将用户重定向回索引页: header("location:../../index.php"); 新网页(index.php)正确加载;但是,当标题重定向页面时,地址栏上的URL不会改变;它停留在*http://localhost/php/server/server_login.ph

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

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

奇怪的是,我在logout.php中对header(“location:…”)的另一种用法可以工作,并通过URL更改成功重定向页面

我已经确保在头重定向之前,我的*server\u login.php*中没有输出(上面只是要检查的mysql调用),我还使用了ob\u start()和ob\u end\u 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");

}

如果服务器发送了正确的重定向头,浏览器就会重定向,从而“更改url”。那可能是浏览器的问题。 我不知道这是否与此有关,但您不应该在location标头中发送相对url(“HTTP/1.1要求将绝对URI作为参数发送到»location:包括方案、主机名和绝对路径,但一些客户端接受相对URI。”,),并且“location”必须大写,如:

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

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

尝试更改:

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


在表单元素中添加
数据ajax=“false”
。我在使用jquery mobile时也遇到了同样的问题。

为什么要使用这些位置url?

http://localhost:8080/meet2eat/index.php
你可以用

index.php
如果php文件在同一个文件夹中,这会更好,因为如果您想托管这些文件
或者更改端口,您访问此URL不会有任何问题。

您应该像
标题(位置:../index.php)
一样使用它,如果它位于另一个文件夹中,则不要使用任何空白。我也有同样的问题。然后我删除了空白,如:

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

然后它工作了。

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


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

我为您找到了一个解决方案,如果您的url类似于

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

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

标题(“Location:index.php”)//这项工作在我的网站


阅读php文档的更多内容。

只需根据您的喜好更改主页即可

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

header('Location: ' . $home_url);

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

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

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

正如“cfphpflex”所建议的,您可以添加
break。您还可以回显某些内容,例如
echo'test'

你能告诉代码你是如何发布数据的吗?我明白了。我已经修复了代码(如上所示),但仍然收到相同的URL错误。:/我已经改为HTTP身份验证,因为我意识到这是我分配要求的一部分,但我仍然对这个奇怪的“错误”感兴趣。请注意WP的根目录中常见的那种“一网打尽”。htacces:RewriteCond%{REQUEST_FILENAME}-f RewriteCond%{REQUEST_FILENAME}-重写规则/index.php[L]检查(即通过日志记录)如果在重定向后通过了两次,那么您的有意重定向(被index.php重新捕获)和另一个随后的重定向会出错。。。实现一个add_过滤器(“[pre_uu]选项_siteurl | home”);do Fourple强制执行新位置可能会对您有所帮助…根据RFC 2616,HTTP头不区分大小写。位置标题不必大写。不知道为什么会被否决,他是对的。必须使用jquery mobile。有同样的问题。您只需要在不需要ajax的元素上添加数据ajax(例如链接),这样jQuery Mobile就不会干扰is。。。即使它不在jQuery Mobile块/表单中。问题是,
index.php
不在同一个文件夹中。使用jQuery Mobile时,我总是忘记这一点!为我工作;)我也有同样的问题。这个
data ajax=false
在我的例子中有效。您可以将前两行合并为一行:header('Location:'。$youraryname[“YourURL”],true,301);