无法在PHP中设置主机

无法在PHP中设置主机,php,curl,web-scraping,web-crawler,Php,Curl,Web Scraping,Web Crawler,我无法将主机设置为卷曲。如果我使用以下代码,它仍然显示为localhost function wget($url) { $agent= 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1'; $curlHeaders = array ( 'Accept: text/html,applicati

我无法将主机设置为卷曲。如果我使用以下代码,它仍然显示为localhost

function wget($url)
        {

            $agent= 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1';
            $curlHeaders = array (
                    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                    'Accept-Encoding: gzip, deflate',
                    'Accept-Language: en-US,en;q=0.5',
                    'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1',
                    'Connection: Keep-Alive',
                    'Pragma: no-cache',
                    'Referer: http://example.com/',
                    'Host: hostname',
                    'Cache-Control: no-cache',
                    'Cookie: visid_incap_185989=9v1q8Ar0ToSOja48BRmb8nn1GFUAAAAAQUIPAAAAAABCRWagbDIfmlN9NTrcvrct; incap_ses_108_185989=Z1orY6Bd0z3nGYE2lbJ/AXn1GFUAAAAAmb41m+jMLFCJB1rTIF28Mg==; _ga=GA1.3.637468927.1427699070; _gat=1; frontend=rqg7g9hp2ht788l309m7gk8qi7; _gat_UA-1279175-12=1; __utma=233911437.637468927.1427699070.1427699078.1427699078.1; __utmb=233911437.2.10.1427699078; __utmc=233911437; __utmz=233911437.1427699078.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt_UA-1279175-1=1; _cb_ls=1; _chartbeat2=S0WVXDwMWnCFBgQp.1427699081322.1427699232786.1; PRUM_EPISODES=s=1427699568560&r=http%3A//example.com/'

            );
            $ch = curl_init();
            curl_setopt ($ch, CURLOPT_HTTPHEADER, $curlHeaders);
            curl_setopt ($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERAGENT, $agent);
            curl_setopt($ch, CURLOPT_URL,$url);
            $result=curl_exec($ch);
            return $result;
        }
我使用
fiddler
跟踪网络请求。我发现主机仍然是localhost

如果我在浏览器中加载相同的链接,我会在
fiddler

我需要访问我指定的域。我怎样才能做到这一点? 注意:我知道主机名不应该包含协议

或者

另外,我想知道是否可以通过终端在浏览器中查看网站的源代码?

试试这样

  curl_init('XXX.XXX.XXX.XXX');
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: subdomain.hostname.com'));

如果您正在使用windows和xampp,然后尝试使用虚拟主机而不是本地主机,那么它将开始工作,我也这样做了。

将完整URL设置为
CURLOPT_UR
L。

根据快速规范阅读,我假设您的问题是由于发送的
主机
头不正确造成的。我可以下载一些带有以下代码的网站:

function wget($url, $follow = true) {

    $host = parse_url($url);

    $agent       = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1';
    $curlHeaders = array(
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Encoding: gzip, deflate',
        'Accept-Language: en-US,en;q=0.5',
        'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1',
        'Connection: Keep-Alive',
        'Pragma: no-cache',
        'Referer: http://example.com/',
        'Host: ' . $host['host'] . (isset($host['port']) ? ':' . $host['port'] : null), // building host header
        'Cache-Control: no-cache',
        'Cookie: visid_incap_185989=9v1q8Ar0ToSOja48BRmb8nn1GFUAAAAAQUIPAAAAAABCRWagbDIfmlN9NTrcvrct; incap_ses_108_185989=Z1orY6Bd0z3nGYE2lbJ/AXn1GFUAAAAAmb41m+jMLFCJB1rTIF28Mg==; _ga=GA1.3.637468927.1427699070; _gat=1; frontend=rqg7g9hp2ht788l309m7gk8qi7; _gat_UA-1279175-12=1; __utma=233911437.637468927.1427699070.1427699078.1427699078.1; __utmb=233911437.2.10.1427699078; __utmc=233911437; __utmz=233911437.1427699078.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt_UA-1279175-1=1; _cb_ls=1; _chartbeat2=S0WVXDwMWnCFBgQp.1427699081322.1427699232786.1; PRUM_EPISODES=s=1427699568560&r=http%3A//example.com/'
    );
    $ch          = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $follow); // following redirects or not
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_URL, $url);
    $result      = curl_exec($ch);
    return $result;
}

echo(wget('http://example.com'));
无论如何,这个函数不是一个通用的构建。就个人而言,我会在重定向请求等之间添加保存cookie。基本更改在“主机”标题行内。我正在根据提供给函数的完整
$url
构建适当的
主机
头。

假设我们没有试图欺骗
主机
头,请完全忽略
主机
头,让curl对其进行排序。在这种情况下,只需删除
'Host:hostname',
,因为您已经可以让curl使用
curl\u setopt($ch,CURLOPT\u URL,$URL)将代码自动设置在底部附近

如果您真的想自己设置
主机
头,那么只需替换

'Host: hostname',

“主机:”。解析url($url,PHP\U url\U主机),


(注意:此函数不适用于相对URL。)

像这样尝试,$ipaddress='desired_ip'$url='path/to/file?';curl_init('http://'.$ipaddress.$url);我正在使用windows和xampp。。这会有什么问题吗?如果通过此代码发送单个请求,然后当我尝试在浏览器中加载此页面时,它会询问CAPTCHA如何使用虚拟主机,我建议从添加
curl\u setopt($ch,CURLOPT\u VERBOSE,true)开始添加到您的代码中,并检查后台实际发生的情况。你可能会从fiddler那里得到更多的信息。我已经试过你的代码了。其他文件接收头
Host:hostname
。我想你需要像这样的东西,我的网站被伪装成“stackoverflow.com”,这是很难做到的。您可以修改头,但不能修改HTTP协议(不容易做到)。因此,我通过将url馈送到函数调用中,在我可以访问的几个主机上运行了此操作,它运行得非常完美。你需要检查一些东西并提供更多信息。1) 该URL是如何馈送到函数调用的,您确定它设置正确吗。例如,如果调用$result=wget($someurl);确保$someurl设置正确。2) 检查您的主机文件和代理设置。将完整URL设置为CURLOPT_URL。我发现我试图刮取的网站正在使用JS验证/验证请求是否通过浏览器发送。如果使用浏览器打开,则主机为example.com,并加载文件
example.com/verify.js
。因此,如果请求是通过浏览器发送的,它将为
localhost/verify.js
加载请求。在此之前,上面的代码返回了一个javascript,我可以在浏览器的inspect元素中看到它。@DharanBro不太理解您的评论。它是在工作还是仍然存在一些问题?