PHP header(Location: …): Force URL change in address bar
我目前正在使用PHP会话和数据库进行身份验证的移动站点上工作。
我有一个登录页面,其表单在提交时转到server_login.php。 php文件然后创建一些会话数据(存储在$ _SESSION中),并将用户重定向回索引页面:
1 |
新网页(index.php)正确加载;但是,当标题重定向页面时,地址栏中的URL不会改变;它保留在* http://localhost/php/server/server_login.php*而不是http://localhost/index.php,因此无法加载使用相对路径的所有其他资源。这就好像网页仍然认为它位于/ php / server而不是/。
奇怪的是,我在logout.php上使用标题("location:...")可以正常工作,并通过URL更改成功重定向页面。
我确保在我的* server_login.php *中没有输出头标题重定向(上面只是要检查的mysql调用),我也使用了ob_start()和ob_end_flush()。
是否有任何强制地址栏上的URL更改的方法(因此希望修复相对路径问题)?或者我做错了什么?
P / S:我正在使用jQuery Mobile。
编辑:这是我的重定向代码,不会更改URL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | // 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"); } |
尝试改变:
1 2 3 4 |
至
1 |
好吧,如果服务器发送了正确的重定向标头,浏览器会重定向,因此"更改网址"。那么它可能是一个浏览器问题。
我不知道它是否与它有任何关系,但你不应该在位置标题中发送一个相对URL("HTTP / 1.1需要一个绝对URI作为参数?位置:包括方案,主机名和绝对路径,但有些客户接受相对URI。",http://php.net/manual/en/function.header.php),"location"必须大写,如:
1 |
在表单元素中添加
发布表单时遇到了同样的问题。我所做的是关闭数据-ajax。
你可能想休息一下;在你的位置后:
1 2 3 |
不要使用任何空白区域。我遇到过同样的问题。然后我删除了白色空间,如:
然后它奏效了。
正如"cfphpflex"建议您在设置标题后添加
//注册用户的名称和ID
1 2 3 4 5 6 7 | 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
1 2 3 4 5 6 | 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"); } |
如果没有找到会话数据,您确定您正在重定向的页面没有重定向吗?那可能是你的问题
也是,总是添加像@Peter O建议的空格。
根据自己的喜好换回家
1 2 3 |
我为你找到了一个解决方案,如果你的网址是这样的话,为什么不使用Explode呢?
Url-> website.com/test/blog.php
1 2 3 |
使用
header("Location:index.php"); //这个工作在我的网站上
在php文档中阅读更多关于header()的内容。
如果它在另一个文件夹中,您可以像
为什么所有这个位置网址?
1 | http://localhost:8080/meet2eat/index.php |
你可以使用
1 | index.php |
如果php文件在同一个文件夹中,这样更好,因为如果你想托管文件
或更改端口,您将没有问题到达此URL。