在 URL 中傳遞驗證資訊(如 "https://user:password@example.com")適用於 HTTP "基本" 存取驗證,但不適用於 HTTP "摘要" 存取驗證。您可以使用 cURL 函數來處理要求 HTTP "摘要" 存取驗證的伺服器。
http:// -- https:// — 存取 HTTP(s) URL
允許透過 HTTP 以唯讀方式存取檔案/資源。預設情況下,會使用 HTTP 1.0 GET。`Host:` 標頭會隨著請求傳送,以處理基於名稱的虛擬主機。如果您已使用您的 php.ini 檔案或串流內容設定了 user_agent 字串,則也會包含在請求中。
串流允許存取資源的 *主體*;標頭儲存在 $http_response_header 變數中。
如果知道您的文件來自哪個資源的 URL(在處理完所有重新導向之後)很重要,則需要處理串流傳回的一系列回應標頭。
範例 #1 偵測我們在重新導向後最終所在的 URL
<?php
$url = 'http://www.example.com/redirecting_page.php';
$fp = fopen($url, 'r');
$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {
/* 我們是否被重新導向? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {
/* 使用我們被重新導向到的位置更新 $url */
$url = substr($response, 10);
}
}
?>
注意: 只有在啟用 openssl 擴充功能時,才支援 HTTPS。
HTTP 連線是唯讀的;不支援將資料寫入或複製檔案到 HTTP 資源。
例如,可以使用 HTTP 上下文來發送 *POST* 和 *PUT* 請求。
在 URL 中傳遞驗證資訊(如 "https://user:password@example.com")適用於 HTTP "基本" 存取驗證,但不適用於 HTTP "摘要" 存取驗證。您可以使用 cURL 函數來處理要求 HTTP "摘要" 存取驗證的伺服器。
如本頁所述
"串流允許存取資源的主體;標頭儲存在 $http_response_header 變數中。自 PHP 4.3.0 起,可以使用 stream_get_meta_data() 取得標頭。"
這句話是我找到的唯一關於神秘的 $http_response_header 變數的文件,恐怕它具有誤導性。它暗示從 4.3.0 開始,應該使用 stream_get_meta_data() 來取代 $http_response_header。
別被騙了!stream_get_meta_data() 需要串流參考,這使得它僅適用於 fopen() 和相關函數。然而,$http_response_header 可用於從更簡單的 file_get_contents() 和相關函數取得標頭,這使得它在 5.x 中仍然非常有用。
另請注意,即使 file_get_contents() 和相關函數因 4xx 或 5xx 錯誤而失敗並傳回 false,標頭仍然在 $http_response_header 中可用。
HTTP post 函數;
<?php
function post_it($datastream, $url) {
$url = preg_replace("@^http://@i", "", $url);
$host = substr($url, 0, strpos($url, "/"));
$uri = strstr($url, "/");
$reqbody = "";
foreach($datastream as $key=>$val) {
if (!empty($reqbody)) $reqbody.= "&";
$reqbody.= $key."=".urlencode($val);
}
$contentlength = strlen($reqbody);
$reqheader = "POST $uri HTTP/1.1\r\n".
"Host: $host\n". "User-Agent: PostIt\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: $contentlength\r\n\r\n".
"$reqbody\r\n";
$socket = fsockopen($host, 80, $errno, $errstr);
if (!$socket) {
$result["errno"] = $errno;
$result["errstr"] = $errstr;
return $result;
}
fputs($socket, $reqheader);
while (!feof($socket)) {
$result[] = fgets($socket, 4096);
}
fclose($socket);
return $result;
}
?>