cURL връща 302 или 404, докато браузърът връща 200

C++ JAVA
Post Reply
User avatar
Ticketa
Потребител
Потребител
Reactions: 3
Posts: 627
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

cURL връща 302 или 404, докато браузърът връща 200

Post by Ticketa »

Имам скрипт, който използва cURL, за да влезе в даден сайт и да прочете структурата и данните на даден сайт, но това наскоро спря да работи поради cURL заявки, връщащи 302's грешка и пренасочващи към страница, която връща грешка 404 (пък тя си работи през browser). Ако правя същите действия с браузър, няма пренасочвания, а само 200 OK.

Скрипта го ползвам за СЕО анализ на самите страници (скрипта анализира сайта направен от мен, връща ми данните "сдъвкани с препоръки ако има нещо да се оправя"). Единствено направих промяна в сайта като добавих един редирект за мулти езичност и от там ми се счупи "робота" за Сео анализ.

Проблемния ми скрипт:

Code: Select all

<?php
ini_set("display_errors", "1"); error_reporting(E_ALL); 
function get_http_response_code($url, $timeout = 10) {
	$curl = curl_init();
	$options = [
		CURLOPT_URL => $url,
		CURLOPT_HEADER => 1,
		CURLOPT_RETURNTRANSFER => 1,
		CURLOPT_FOLLOWLOCATION => true,
		CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
		CURLOPT_REFERER => 'https://google.com/',
		CURLOPT_AUTOREFERER => false,
		CURLOPT_TIMEOUT => $timeout,
	];
	
	curl_setopt_array($curl, $options);
	$data = curl_exec($curl);
	$headers = curl_getinfo($curl);
	curl_close($curl);
	return ( empty($headers['http_code']) || $headers['http_code'] != 200 ) ? false : true;
}
$url_encode = "https://saita.com";
if ( ! get_http_response_code( $url_encode ) ) {
    echo "Страницата не бе намерена";
}
Резултата, който ми връща с изк. команда: CURLOPT_FOLLOWLOCATION => false,
Array
(
[url] => https://saita.com/
[content_type] => text/html; charset=UTF-8
[http_code] => 302
[header_size] => 442
[request_size] => 175
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.030426
[namelookup_time] => 0.005358
[connect_time] => 0.005443
[pretransfer_time] => 0.013826
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => -1
[starttransfer_time] => 0.030395
[redirect_time] => 0
[redirect_url] => https://saita.com/us/
[primary_ip] => ***.***.***.***
[certinfo] => Array
(
)

[primary_port] => 443
[local_ip] => ***.***.***.***
[local_port] => 54406
)
<br>Страницата не бе намерена

Резултата, който ми връща с включена команда: CURLOPT_FOLLOWLOCATION => true,
Array
(
[url] => https://saita.com/us/
[content_type] => text/html; charset=utf-8
[http_code] => 404
[header_size] => 939
[request_size] => 353
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 1
[total_time] => 0.074507
[namelookup_time] => 0.005696
[connect_time] => 0.005787
[pretransfer_time] => 0.014841
[size_upload] => 0
[size_download] => 14361
[speed_download] => 194067
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0.074414
[redirect_time] => 0.034199
[redirect_url] =>
[primary_ip] => ***.***.***.***
[certinfo] => Array
(
)

[primary_port] => 443
[local_ip] => ***.***.***.***
[local_port] => 54392
)
Страницата не бе намерена
Пробвах да добавя и следната проверка , но файдата е никаква:

Code: Select all

if (in_array($headers['http_code'], [301, 302, 404])) {
        preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);

        if (isset($matches[2])) {
            $redirectUrl = trim($matches[2]);

            if ($redirectUrl !== '') {
                curl_setopt($url, CURLOPT_URL, $redirectUrl);
                return get_http_response_code($url);
            }
        }
 }
Отново казвам - страницата(сайта) си работи безупречно през браузъра и няма грешки, освен ако се опитам да "вляза" с cURL.


Скрипта (cURL) се счупи когато добавих в сканиращия сайт следния код:

Code: Select all

// $http_lang_home_url = https://saita.com
switch ( $settings['locale'] ) { //default
    case LANG:
		if ( ! empty($_SERVER['REQUEST_URI']) ) {
			if ( substr($_SERVER['REQUEST_URI'], 0, 3) == '/' . $lng->default ) {
				header( "Location: " . $http_lang_home_url . substr($_SERVER['REQUEST_URI'], 4) );
				exit;
			}
		}
		break;
		
	default:
		$http_lang_home_url .= LANG . '/';
		if ( substr($_SERVER['REQUEST_URI'], 0, 3) != '/' . LANG ) {
			header( "Location: " . $http_lang_home_url . substr($_SERVER['REQUEST_URI'], 1) );
			exit;
		}
		break;
}
User avatar
Ticketa
Потребител
Потребител
Reactions: 3
Posts: 627
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

Re: cURL връща 302 или 404, докато браузърът връща 200

Post by Ticketa »

ЕДИТ: Промених опциите като добавих бисквитки:
$tmpfname = dirname(__FILE__).'/cookie.txt';
$options = [
CURLOPT_URL => $url,
CURLOPT_HEADER => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
CURLOPT_REFERER => 'https://google.com/',
CURLOPT_AUTOREFERER => false,
#CURLOPT_SSL_VERIFYPEER => 0,
#CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_VERBOSE => true,
CURLOPT_COOKIE => "lng=bg;",
CURLOPT_COOKIEJAR => $tmpfname,
CURLOPT_COOKIEFILE => $tmpfname,

];
Проблема е, че бисквитката lng=bg; е променлва (т.е. ако се промени кода ще се чупи cURL отново, дали има как първо да вземам lng бисквитката и тогава пак да го сканирам?

Сега с добавената (червения код) бисквитка работи успешно. Вече въпроса е да се вземе първо съществуващият език и да се "запамети бисквитката" при второто сканиране.
uphero
Потребител
Потребител
Reactions: 0
Posts: 799
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 35
Location: Казанлък
Contact:

Re: cURL връща 302 или 404, докато браузърът връща 200

Post by uphero »

на тия въпроси е отговорено милион пъти със примери и линкове за референция..
това да чакаш наготово някой да ти го смели...
Post Reply