2010-05-14 142 views
1

我有一個網站,允許公衆訪問某些網頁,但需要其他人登錄。我有一個從所有頁面登錄的鏈接,並且成功登錄後我想要做的是將用戶發回到他們點擊登錄鏈接時所在的頁面。我知道HTTP_REFERER可能被欺騙,有時會被某些主機和代理剝離出去,但由於它嚴格限制在我自己的網站中,並且只是爲用戶提供便利,所以我並不太擔心。

雖然我很好奇它爲什麼不與重定向結合使用。我設置了一個可見字段來包含http referer的值,並且它正確顯示。因此該頁面正在獲取referrer變量的值。但是,當我嘗試這個:

$home_url = $_SERVER['HTTP_REFERER']; 
header('Location: ' . $home_url); 

它不起作用。另一方面,這樣做:

$home_url = 'http://' . $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/discussions.php'; 
header('Location: ' . $home_url); 

所以我知道標題位置部分的作品。任何想法爲什麼它不想與http_referer變量一起工作?

(另外,它驅動該引薦拼寫錯誤任何人瘋了嗎?我一直使用OED拼音打錯了,我傻...)

回答

1

在登錄驗證頁面,引用者將是登錄頁面,而不是原始頁面(除非您使用存儲在cookie或HTTP basic/digest auth中的憑據)。

您可以做的是,在登錄頁面中,用戶輸入詳細信息,使用引用登錄頁面請求的引用程序的隱藏字段,然後將其傳遞給驗證登錄並執行轉發的腳本如果登錄成功。更好的是:由於用戶可能不會發送引用程序(它可在大多數瀏覽器中配置),因此鏈接到登錄頁面的查詢字符串中包含原始頁面。然後像上面那樣繼續,但是使用這個值而不是引用者。

要明確:

<form method="post" action="login"> 
... 
<input name="user" type="text" /> 
<input name="password" type="password" /> 
<input name="referer" type="hidden" value="<?php echo urlencode($_SERVER['HTTP_REFERER']) ?>" /> 
</form> 

然後

<?php 
if (login_is_successful() && !empty($_POST['referer']) && !is_array($_POST['referer'])) { 
    header("Location: ".urldecode($_POST['referer'])); 
    die(); 
} 
+0

謝謝 - 我剛剛想到的是,幾分鐘前,一邊吃晚餐。 – EmmyS 2010-05-15 00:44:39

2

什麼的$_SERVER['HTTP_REFERER']在第一個例子中的價值?它設置正確嗎?

您知道,如果您只是在地址欄中輸入網址,大多數瀏覽器都不會發送引薦字符串。

相關問題