我正在构建一个简单的php代理,用于缓存响应头和对象。
我的问题是,如果我登录youtube.com然后我不会看到自己因为我已经签名并且youtube一直说登录(未签名),但如果我停止我的脚本并打开youtube.com网站然后我看到我自己签了名。我认为这是一个cookie问题。是吗?
我的脚本只需抓取响应标头并将其发送回浏览器。当我使用fopen()下载对象时,谷歌的一些网站“Play STore”& “Apple Store”继续发送HTTP 403(Forbidden),即使我通过$ _SERVER ['HTTP_USER_AGENT']捕获客户端的用户代理并将其附加到$ context function stream_context_create()..仍然没有运气!。
我在响应标题中看到了这样的标题Set-Cookie所以我想如果我使用header()将其发送回浏览器那么它就会被解决..仍然没有运气。
这就是我获取客户端请求的cookie的方法 $ requested_cookie = $ _COOKIE;
$requested_cookie = $_COOKIE;
$ua= $_SERVER['HTTP_USER_AGENT'];
ini_set('user_agent', $ua);
$md5_fname = md5($fname);
$filehead = $file_path."/HTTP_HEADER/".$md5_fname.".txt";
if (file_exists($filehead))
{
$handle = fopen($filehead, "r");
$contents = fread($handle, filesize($filehead));
$getCachedH = unserialize($contents);
fclose($handle);
foreach ($getCachedH as $cHead)
{
$sendHead = $cHead;
$getHead = strtoupper($cHead);
//file_put_contents("$file_path/ghassan.txt", "\n $sendHead \n" ,FILE_APPEND);
if ( preg_match('/CONTENT-LENGTH: (\d+)/i',$getHead,$clm) ) $content_length = $clm[1];
if ( preg_match('/CONTENT-TYPE: ([\/\w\-\d]+)/i',$getHead,$ctm) ) $content_type = $ctm[1];
if ( preg_match('/LOCATION: (.*)/i',$cHead,$lm) )
{
$header_location = $lm[1];
header("Location: ".$header_location);
exit;
}
if ( preg_match('/^HTTP\/1\.[01] (\d\d\d)/i', $getHead, $hcm ) )
{
$http_code = $hcm[1];
}
header($sendHead);
}
}
else
{
$opts = array(
'http'=>array(
'ignore_errors'=>"true",
'method'=>"GET",
'header'=>"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
$urlptr = fopen($_GET['url'],'rb', false, $context);
$headers = $http_response_header;
$http_code = $headers[0];
if($http_code=="200")
{
// We grab the Response Headers and save them
file_put_contents($filehead, serialize($headers));
}
foreach ($headers as $response_header)
{
$sendHead = $response_header;
$getHead = strtoupper($response_header);
header($sendHead);
if ( preg_match('/CONTENT-LENGTH: (\d+)/i',$getHead,$clm) ) $content_length = $clm[1];
if ( preg_match('/CONTENT-TYPE: ([\/\w\-\d]+)/i',$getHead,$ctm) ) $content_type = $ctm[1];
if ( preg_match('@Set-Cookie: (([^=]+)=[^;]+)@i', $sendHead , $cookm))
{
$sCookies = $cookm[1];
//file_put_contents("$file_path/cookies.txt", "\n $cookm[0], $url \n" ,FILE_APPEND);
}
if ( preg_match('/LOCATION: (.*)/i',$sendHead,$lm) )
{
$header_location = $lm[1];
header("Location: ".$header_location);
exit;
}
if ( preg_match('/ACCEPT-RANGES: ([\w\d\-]+)/i',$getHead,$arm) ) $accept_ranges = $arm[1];
if ( preg_match('/^HTTP\/1\.[01] (\d\d\d)/i', $getHead, $hcm ) )
{
$http_code = $hcm[1];
}
}
}
是否有一个函数在一次调用中抓取响应头+对象并将它们一起存储在一个文件中?我不想在脚本的顶部使用fopen()因为Apache或Php在读取字符串时如$ handler = fopen($ urlptr,'r');然后它连接远程URL即使我没有调用字符串!这增加了延迟。
当我通过我的脚本从Play商店下载文件时,如果我已经发送Android设备的用户代理,是否有通过我的php脚本访问客户端cookie的解决方案以及如何解决403禁止消息? 。
谢谢
答案 0 :(得分:0)
我已经解决了我的问题。
当我抓住每个网站的远程标题时..标题已经有了Set-Cookie标题,所以我将它们重新发送回浏览器并从$ _COOKIE捕获cookie并使用fopen()添加cookie似乎解决了我所有的问题上方。
谢谢