2010-12-03 58 views
3

我的這個實際實現更加複雜,帶有身份驗證和一堆其他的東西,但是最簡單的形式,這是我遇到的問題。使用標題重定向不會將其本身顯示爲引用者。重定向和查閱者

所以,讓我們說我有三個頁面:start.php,middle.php和end.php

start.php

<html><body> 
<a href="middle.php">middle</a> 
</body></html> 

middle.php

<?php 
header('Location: end.php'); 
?> 

結束。 php

<?php 
    echo 'The referer is: ' . $_SERVER['HTTP_REFERER']; 
?> 

當你按照鏈接,你最終在end.php,但引用者不是middle.php。有沒有其他重定向方法可以用來糾正這個問題,或者我可以做什麼?

乾杯

編輯 在這種情況下,目標頁面是第三方供應商。他們必須驗證的唯一方法是引用URL。我無法控制這一點。我只需要我的頁面來重定向發送正確的URL。這個重定向方法有沒有其他選擇,而不是分開不信任http_referer的原因?

+0

請注意,引薦來源不可信。你可以發送你自己的,或者根本不發送。這裏出現了「Origin」標題。 – jwueller 2010-12-03 23:51:40

+0

這是事實,但我們正在檢查會話。如果您沒有有效的會話,則會被髮送到登錄頁面。 – 2010-12-04 01:34:20

回答

0

我去重定向的老元刷新方法。這爲需要它的供應商保持引用URL。任何不需要它的供應商仍然使用標題功能,以提高速度和易用性。

3

對不起,但它超出了你的控制範圍,只有瀏覽器可以發送該標題 - 而不是全部。它可以很容易僞造,所以不要依賴它。

更多信息可在此php bug(它被標記爲沒有錯誤)。

0

這個問題已經在SO上彈出了很多次(我現在還找不到任何傻瓜),我認爲總是以底線表示它沒有在標準中定義瀏覽器要設置什麼在這種情況下的推薦人。

是否可以使用GET參數或其他參數明確指定它?

0

我建議是這樣的:

header('Location: end.php?from=' . urlencode($_SERVER['PHP_SELF')); 

然後在你想從重定向發出哪裏知道頁:

echo 'redirected from ' . urldecode($_GET['from']); 
0

什麼是你想使用引薦標題信息爲?

如果是對請求源的認證/驗證,那麼你可以考慮嘗試另一種方法。正如El Yobo指出的那樣,Referrer頭部並不是確定某人的請求來自哪裏的簡單方法。

1

由於HTTP_REFERER不可信(可以很容易地從外部修改),因此您可以在每次請求後輕鬆存儲會話中訪問的最後一個頁面。然後在重新加載時輕鬆找回它。

含義,加載引用者爲$ refer_url = $ _SESSION [「referenced_url」]。然後保存$ _SESSION [「referenced_url」] = $ current_absolute_url;結束每個請求時。

雖然,請注意這可能是一個併發問題。並行請求(例如使用AJAX)很容易使會話相信它來自實際上沒有的頁面。

Retrieving the absolute path of the current request