2013-04-04 164 views
3

有沒有辦法讓PHP重定向到新的頁面,並傳遞HTTP-AUTH?使用HTTP-AUTH重定向?

我一直在使用捲曲,作爲第二個例子在這裏: Sending basic authentication information via form

不幸的是,當我這樣做,(在瀏覽器地址欄中顯示)的實際URL保留原始PHP的網址,而不是目標我正在瀏覽。

這裏是我到目前爲止有:

<?php 

$user = "xyz"; 
$pass = "abc"; 
$userpass = $user . ":" . $pass; 

$url = "http://website/directory/"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERPWD, $userpass); 
$result = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 

if($httpcode == 200){ 
    header("Authorization: Basic " . base64_encode($userpass)); 
    echo $result; 
}else{ 
    header("Location: http://website/login.php"); 
} 

?> 

我也曾嘗試更換上面的尾部:

if($httpcode == 200){ 
    header("Authorization: Basic " . base64_encode($userpass)); 
    header("Location: http://website/directory/"); 
}else{ 
    header("Location: http://website/login.php"); 
} 

但失敗了;它重定向到http://website.xyz/directory,但它沒有通過用戶/通行證,並且我在抵達時出現了來自服務器的登錄信息。

從技術上講,下面的工作。然而,我更喜歡比在HREF內傳遞用戶/密碼更優雅的解決方案:

header("Location: http://" . $userpass . "website/directory/"); 

回答

1

嘗試將身份驗證與url一起傳遞。像這樣:

header('Location: http://username:[email protected]/directory/'); 

由於base64像純文本一樣不安全,因此它不應該成爲額外的安全風險。瀏覽器不會顯示用戶:在地址欄中傳遞相關的url部分。但瀏覽器會顯示一個消息框(或其他內容),以確認您將使用用戶名登錄此網站:yourusername

+0

我也這麼想過。當HTTP-AUTH被重定向時,它似乎並未將HTTP-AUTH傳遞給新頁面;到達新位置後,我仍然通過網絡服務器提示用戶/通行證。 – ltwally 2013-04-04 18:36:10

+1

您確定您要重定向到的網站正在接受您的憑證嗎?我用兩個不同的文件夾在本地主機上測試過它,它工作了 – hek2mgl 2013-04-04 18:41:53

+1

我看了上面的代碼,並替換了「echo $ result;」與「標題('位置:http://網站/目錄');」,這是我所嘗試過的。它失敗了。到達http:// website/directory /後,我收到了登錄提示。 – ltwally 2013-04-04 18:59:42

1

對您遇到的問題的解釋:Authorization標題僅適用於在HTTP請求中。它在HTTP響應中沒有意義,比如放置它的位置,因此瀏覽器忽略它。

您得到的解決方案(在URL中傳遞用戶名和密碼)與您將要獲得的一樣好。沒有其他可用的選擇。