我正在尝试从Web获取数据并使用cURL 和Simple HTML Dom PHP类向用户显示数据。
某些页面有重定向,具体取决于客户端的语言,我使用的函数来确定要删除的最终页面。
为了以用户看到的方式显示它,我正在使用它:
$useragent = $_SERVER['HTTP_USER_AGENT'];
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
目前我的大部分用户都是讲西班牙语的人,因此我暂时限制接受的语言,因此如果目标网页上有语言重定向,它将首先显示西班牙语或英语。< / p>
$header[] = "Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3";
但是,由于我的服务器位于荷兰,而某些页面有基于IP的重定向器,因此有时页面会重定向到/ nl /目录,忽略语言参数。
例如,使用 www.econsultancy.com 网站就会发生这种情况。
是否可以避免这种重定向,可能在cURL请求中使用客户端的IP地址?
此外,是否可以使用客户端的浏览器语言设置来使 Accept-Language 参数动态化?
这是整个函数脚本:
<?
function redirector($originalurl) {
$ch = curl_init();
$useragent = $_SERVER['HTTP_USER_AGENT'];
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3";
$header[] = "Pragma: ";
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $originalurl);
$out = curl_exec($ch);
$out = str_replace("\r", "", $out);
$headers_end = strpos($out, "\n\n");
if( $headers_end !== false ) {
$out = substr($out, 0, $headers_end);
}
$headers = explode("\n", $out);
foreach($headers as $header) {
if( substr($header, 0, 10) == "Location: " ) {
$target = substr($header, 10);
$targeturl = $target;
}
}
return $targeturl;
}
?>
提前致谢!
答案 0 :(得分:1)
某些基于IP的重定向非常顽固(并且几乎不可能将某些页面从&lt;任何页面认为您的语言是&gt; 切换到英语),但您可能会尝试拦截任何重定向使用CURLOPT_FOLLOWLOCATION
设置为False
并解析Location
标头(此解决方案要求您正确猜测网址):
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if( $status_code >= 300 && $status_code < 400){
// Was redirect, parse header
if( substr( $location, '/nl/') !== false){
// Try to load page $url = str_replace( $location, '/nl/', '/en/');
// Remember to check whether page exists
} else {
// Continue request
}
}
如果您能够在“每个站点”的基础上执行此操作(为每个站点创建功能以切换语言),您可以跟踪切换语言时发生的情况(例如Firefox具有完美plugin for this)和大部分时间你最终都会使用:
/nl/
,lang=nl
,l=nl
,... / LI>
POST
用户名和密码)运气不错,你会很好地结合你所拥有的“大阵列”的cookie值,如下所示:
array (
'lang' => 'eng',
'l' => 'en',
'Language' => 'Engligh',
...
)
但是,一旦遇到两个使用相同“cookie变量名称”和不同值的页面:
lang=eng
lang=en
lang=7
你被搞砸了,你将不得不再次使用某种switch($domain)
。