Stckoverflow говорит, что плохо на PHP - PullRequest
0 голосов
/ 04 марта 2012

У меня есть этот cURL код в php.

curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java")); 
curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_HTTPHEADER, $v);
curl_setopt($ch, CURLOPT_VERBOSE, true);

Содержимое HTTPHEADER есть;

Proxy-Connection: Close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=blabla
Connection: Close

Каждый из них - отдельные элементы в массиве $v.

Когда я загружаю файл на свой хост и запускаю код, я получаю:

400 Неправильный запрос

Ваш браузер отправил неверный запрос.

Но когда я запускаю его в своей системе с использованием командной строки PHP, я получаю вот эту и полную страницу.

< HTTP/1.1 200 OK
< Vary: Accept-Encoding
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Content-Encoding: gzip
< Date: Sat, 03 Mar 2012 21:50:17 GMT
< Connection: close
< Set-Cookie: buncha cokkies; path=/; HttpOnly
< Content-Length: 22151
< 
* Closing connection #0

.

Это происходит не только на стеке, это также происходит на 4shared, но работает и в Google и других.

Спасибо за любую помощь.

Ответы [ 3 ]

1 голос
/ 04 марта 2012

Ваш пустой аргумент CURLOPT_ENCODING вызывает проблему. Если вы не хотите использовать gzip / deflate, просто опустите заголовок.

Я также вижу, что вы определяете кодировку как в вашем curl_setopt (), так и в массиве HTTP_HEADER. Вы должны использовать собственные команды curl_setopt(), когда это возможно. CURLOPT_USERAGENT - это тот, который вы можете переместить из массива HTTP_HEADER.

Но, как упоминал Эндрю Маршалл, вы не должны заниматься очисткой экрана; тем более что у них есть API.

EDIT

Вот пример сценария, который я использую:

<?php

$v = Array(
    'Proxy-Connection: Close',
    'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-US,en;q=0.8',
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3',
    'Cookie: __qca=blabla',
    'Connection: Close'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java"));
//curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_HTTPHEADER, $v);
curl_setopt($ch, CURLOPT_VERBOSE, true);

echo curl_exec($ch);
?>

Теперь я запускаю это через командную строку, но чистый эффект тот же. Я удалил Accept-Encoding в массиве $v просто, чтобы получить несжатый вывод.

Единственное, что мы не установили, это ваши версии PHP и libcurl. Для меня это PHP 5.3.2 с libcurl 7.12.1. Это может быть важно. Вы можете найти свою версию libcurl либо с помощью php -i | grep -i curl в командной строке, либо с помощью phpinfo() через веб-скрипт на вашем сервере.

0 голосов
/ 04 марта 2012

Кажется, какой-то заголовок нарушает ожидаемый шаблон запроса на некоторых сайтах. Самый простой способ исправить это - удалить заголовки по одному и проверить.

Я думаю, что это должна быть кодировка.

0 голосов
/ 04 марта 2012

Кажется, что заголовок "Host" отсутствует:

Host: stackoverflow.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...