2011-03-19 59 views
-1

我有3個文件,account.php的index.phpbrowser.php爲什麼我的PHP頭('Location:...')調用忽略HTTP GET請求?

成功登錄之後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.phpbrowser.php後什麼 '?'。每次url只顯示browser.php

這是怎麼回事?


[編輯]

井問題是固定的,通過在index.php一些可怕如果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保存重定向上的變量。感謝大家!

+5

爲什麼不使用會話呢?通過網址傳遞登錄信息似乎是一個非常糟糕的主意 – knittl 2011-03-19 22:46:57

+0

'header('Location:index.php?m ='。base64_encode(')'));'Use sessions請爲這個東西。 – Charles 2011-03-19 22:55:25

+1

總是把'退出;'用'header'重定向後' – Galen 2011-03-20 00:00:10

回答

2

1)爲什麼使用base64_encode而不是urlencode

2)Location頭應該是一個完整的URL,包括協議和服務器名稱(如果我沒記錯的話)。

3)參見knittl的評論。

+0

將您標記爲已解決,因爲您已向我指出knittl的評論,這將成爲我嘗試實現的「答案」。問題在於我是否有其他邏輯。 – JustinBull 2011-03-19 23:58:36

2

爲什麼這麼複雜的結構?爲什麼不直接從帳戶重定向到瀏覽器?

儘管瀏覽器對url語法極其寬容,但它應該是完全限定的url,從http://開始。我懷疑./可能是原因,但爲什麼你不只是browser.php?

無論如何,你必須調試你的代碼來發現實際問題。

首先,您必須觀看實際發送的HTTP請求。 Firebug或LiveHTTPHeaders Firefox插件可以做到這一點。

要打印出所有的位置字符串是絕對必要的。只需用echo()函數輪流替換所有header()函數,然後查看代碼即將發送的實際頭文件。

0

您顯示的代碼是完美的,應該可以工作。問題必須在別處。你可以使用Live HTTP Headers,Firebug或類似的方法檢查標題,看看發生了什麼?我認爲你的問題在別處。

編輯:其他答案提到,相對URL不符合標準。這是真的,但是雖然RFC禁止它們,但它們確實有效(儘管我不會編寫./browser.php而只是使用browser.php)。

相關問題