为什么我的PHP标头('Location:...')调用忽略了HTTP GET请求?

时间:2011-03-19 22:43:45

标签: php http-headers

我有3个文件, account.php index.php browser.php

成功登录后, account.php 会调用以下函数:

header('Location: index.php?m='.base64_encode('Signed in'));

index.php 调用:

header('Location: ./browser.php?m='.$_GET['m']);

browser.php 显示:

if(isset($_GET['m']))
    echo '<h3 style="color:green">'.base64_decode($_GET['m']).'</h3>';

问题是从 index.php browser.php 标题('位置:...')调用后删除了所有内容'?'。每次网址只显示 browser.php

发生了什么事?


[编辑]

问题是由index.php中的一些可怕的if else逻辑修复的。 执行以下操作无效(将始终运行最新标头)

if(isset($_GET['m']))
    header('Location: browser.php?m='.$_GET['m']);
if(isset($_GET['e']))
    header('Location: browser.php?e='.$_GET['e']);
header('Location: browser.php');

我不得不重新调整它:

if(isset($_GET['m']))
    header('Location: browser.php?m='.$_GET['m']);
else if(isset($_GET['e']))
    header('Location: browser.php?e='.$_GET['e']);
else
    header('Location: browser.php');

但坦率地说,这一切都无关紧要,我应该使用$ _SESSION来保留重定向变量。谢谢大家!

3 个答案:

答案 0 :(得分:2)

1)为什么使用base64_encode,而不是urlencode

2)Location标题应该是一个完整的网址,包括协议和服务器名称(如果我没记错的话)。

3)见knittl的评论。

答案 1 :(得分:2)

为什么结构如此复杂?为什么不直接从帐户重定向到浏览器?

尽管浏览器极其容忍url语法,但它应该是完全限定的url,从http://开始。我怀疑./可能是什么原因,但你为什么不把它作为browser.php?

无论如何,您必须调试您的代码才能发现实际问题。

首先,您必须观察发送的实际HTTP请求。 Firebug或LiveHTTPHeaders Firefox插件可以做到。

打印出所有位置字符串是绝对必要的。只需使用echo()替换所有header()函数,并查看代码将要发送的实际标头

答案 2 :(得分:0)

您展示的代码是完美的,应该可以使用。问题必须在其他地方。你可以使用Live HTTP Headers,Firebug或类似方法检查标题,看看发生了什么?我认为你的问题在其他地方。

编辑:其他答案提到相对网址不符合标准。这是事实,但是虽然RFC禁止它们,但它们确实有效(尽管我不会写./browser.php而只是编写browser.php)。