簡體   English   中英

從重定向php獲取set-cookie頭

[英]Get set-cookie header from redirect php

好的,到目前為止,我還沒有找到解決方案,我需要開始就SO提出問題,這樣我才能贏得聲譽,並希望能幫助其他人。

我正在制作一個wordpress插件,可以從遠程站點檢索項目的json列表。 最近,該網站為Cookie添加了重定向檢查。

在沒有cookie的第一個請求后,將提供302標頭,該標頭指向第二個頁面,該標頭還返回指向首頁的302重定向。 但是,在第二頁上,還提供了set-cookie標頭,以防止主頁再次重定向。

但是,當我向站點上的URL發出cURL請求時,它在重定向循環中失敗。

現在,顯然,最簡單的解決方案是將其修復在遠程服務器上。 它不應該為api路由實現該重定向。 但這對我來說不是一個選擇。

我已經找到了如何從2 **代碼響應中檢索set-cookie標頭值的方法,但是當提供302標頭時,我似乎無法弄清楚如何訪問該值,並且cURL除了錯誤外什么都沒有返回。

即使達到最大(20)重定向次數,也有辦法訪問標頭嗎?

設置一定數量的重定向后,是否可以停止執行?

如何獲得該Cookie的值,以便可以在最終請求中提供它?

在開始嘗試向組合中添加Cookie之前,您已經遇到了問題。 進行單個重定向不利於性能。 使用302響應作為將數據表示與HTTP / 1,1或更高版本下的數據檢索相分離的一種方法是不好的(它可以工作,但是違反了協議- 如果確實必須重定向,則應使用303)。

嘗試在3xx響應中設置Cookie不能在所有瀏覽器中一致地工作。 在Ajax響應中設置cookie不能在所有瀏覽器中一致地工作。

它不應該實現api路由的重定向

也許遠程站點的人們正在試圖阻止您竊取他們的內容?

首先在iframe中獲取首頁,以填充Cookie並在瀏覽器中的域中記錄一個標志。

實際上,我在發布后當然發現了另一個SO問題,它使我朝着正確的方向實現了這一目標,在這里

我使用了WebGet類來進行curl請求。 它已經三年沒有維護,但是仍然可以正常工作。

它具有一個功能,使卷曲請求,而無需遵循重定向循環。

該函數中設置了很多curl選項,curl不會在其中返回錯誤,因此我確信確切的解決方案可能會更簡單。 這里是任何想要深入研究的人的curl選項列表。

這是我處理每個回復以獲得最終回復的方式

        $w = new WebGet();

        $cookie_file = 'cookie.txt';

        if (!file_exists($cookie_file)) {
            $cookie_file_inter = fopen($cookie_file, "w");
            fclose($cookie_file_inter);
        }

        $w->cookieFile = $cookie_file; // must exist and be writable
        $w->requestContent($url);

        $headers = $w->responseHeaders;

        if ($w->responseStatusCode == 302 && isset($headers['LOCATION'])) {
            $w->requestContent($headers['LOCATION']);
        }

        if ($w->responseStatusCode == 302 && isset($headers['LOCATION'])) {
            $w->requestContent($headers['LOCATION']);
        }

        $response = $w->cachedContent;

當然,這都是非常糟糕的做法,並且會對性能產生嚴重影響,但是可能會有一些罕見的用例發現需要這樣做。

如果使用cURL選項CURLOPT_HEADER ,則從curl_exec返回的數據將包括每個響應的標頭,包括302。

如果在cURL中啟用了cookie處理,除非您希望手動處理它,否則它應該可以很好地拾取302響應設置的cookie。

當可能有多個重定向時,我經常這樣做:

$ch = curl_init($some_url_that_302_redirects);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, ''); // enable curl cookie handling

$result = curl_exec($ch);
// $result contains the headers from each response, plus the body of the last response

$info   = curl_getinfo($ch); // info will tell us how many redirects were followed

for ($i = 0; $i < intval($info['redirect_count']); ++$i) {
    // get headers from each response
    list($headers, $response) = explode("\r\n\r\n", $response, 2);

    // DO SOMETHING WITH $headers HERE
    // If there was a redirect, headers will be all headers from that response,
    // including Set-Cookie headers
}

list($headers, $body) = explode("\r\n\r\n", $response, 2);

// Now $headers are the headers from the final response
// $body is the content from the final response

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM