Curl 301 ошибка

CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an
open_basedir is set

You may try this:

Solution 1:

Set safe_mode = Off in your php.ini file (it’s usually in /etc/ on the server). If that’s already off, then look around for the open_basedir stuff in the php.ini file and comment that line (#open_basedir…). Restart apache server.

Solution 2:
If the above doesn’t work (it should!) try this:

<?php
function geturl($url){

(function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CrawlBot/1.0.0)');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    # required for https urls
    curl_setopt($ch, CURLOPT_MAXREDIRS, 15);     

$html = curl_exec($curl);
$status = curl_getinfo($curl);
curl_close($curl);

if($status['http_code']!=200){
    if($status['http_code'] == 301 || $status['http_code'] == 302) {
        list($header) = explode("rnrn", $html, 2);
        $matches = array();
        preg_match("/(Location:|URI:)[^(n)]*/", $header, $matches);
        $url = trim(str_replace($matches[1],"",$matches[0]));
        $url_parsed = parse_url($url);
        return (isset($url_parsed))? geturl($url):'';
    }
}
return $html;
}

?>

Пишу парсер страницы www.yell.ru/moscow/com/mosvet-mosvet-veterinarnaya…
Вот сам код

$ci = curl_init('http://www.yell.ru/moscow/com/mosvet-mosvet-veterinarnaya-klinika_2028012');
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ci, CURLOPT_HEADER, true);
        $header[] = "Connection: keep-alive";
        $header[] = "Pragma: no-cache";
        $header[] = "Cache-Control: no-cache";
        $header[] = "Upgrade-Insecure-Requests: 1";
        $header[] = "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0";
        $header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        $header[] = "Accept-Encoding: gzip, deflate";
        $header[] = "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3";
        $header[] = "Cookie: PHPSESSID=6gr04a7dmpdft1ekojd3e7v9u2; referrer=typein; entry_page=http%3A%2F%2Fwww.yell.ru%2Fmoscow%2Fcom%2Fmosvet-mosvet-veterinarnaya-klinika_2028012%2F; edition=moscow; browserId=8zmBJaAVzRveB6dfAX8pry7uXVuHbP; _ym_uid=1477249415409822960; _ym_isad=2; _ga=GA1.2.1396808801.1477249416; _dc_gtm_UA-3064419-7=1";
        curl_setopt($ci, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ci, CURLINFO_HEADER_OUT, true);
        curl_setopt($ci, CURLOPT_FOLLOWLOCATION, true);
        $product = curl_exec($ci);
        curl_close($ci);

Возвращает это:
fbbe0b6ba38248fb9cf920abbbb86192.png

Как обойти редирект?

Спасибо!

Solution 1:[1]

You need to follow the redirect using the CURLOPT_FOLLOWLOCATION option:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

From the documentation:

TRUE to follow any «Location: » header that the server sends as part
of the HTTP header (note this is recursive, PHP will follow as many
«Location: » headers that it is sent, unless CURLOPT_MAXREDIRS is
set).

Or you can simply use https:// in your code to avoid the redirect.

Solution 2:[2]

// conditions to send sms 

$data = array('username' => $username, 'apikey' => $apikey, 'numbers' => $mobile, "sender" => $sender, "message" => $msg);

if($this->sms_env == true)
{

    $ch = curl_init('https://api.textlocal.in/send?');

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

    $response = curl_exec($ch);

    $decoded_response = json_decode($response, true);

    curl_close($ch);

    $sms_status = @$decoded_response['status'];

    $status['sms'] = $sms_status;
}

$db_data = array(
    'sms_response'  => @$response,
    'unique_code'   => @$unique_code,
    'mobile_no'     => @$mobile,
    'message'       => @$msg,
    'username'      => $username,
    'apikey'        => $apikey,
    'sender_id'     => $sender
);

return $db_data;

Answer by Cooper Guerrero

Set safe_mode = Off in your php.ini file (it’s usually in /etc/ on the server). If that’s already off, then look around for the open_basedir stuff in the php.ini file and comment that line (#open_basedir…). Restart apache server.,

Looks like the server does not provide WHERE the location moved to, so your curl does not have any url to FOLLOWLOCATION. You can’t do anything and your code is correct.

– Daniel W.

Jan 20 ’14 at 12:14

,

How do I get a fellow mathematician to examine my work when I have a bad standing in my home department?

,
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Solution 2:
If the above doesn’t work (it should!) try this:

<?php
function geturl($url){

(function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CrawlBot/1.0.0)');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    # required for https urls
    curl_setopt($ch, CURLOPT_MAXREDIRS, 15);     

$html = curl_exec($curl);
$status = curl_getinfo($curl);
curl_close($curl);

if($status['http_code']!=200){
    if($status['http_code'] == 301 || $status['http_code'] == 302) {
        list($header) = explode("rnrn", $html, 2);
        $matches = array();
        preg_match("/(Location:|URI:)[^(n)]*/", $header, $matches);
        $url = trim(str_replace($matches[1],"",$matches[0]));
        $url_parsed = parse_url($url);
        return (isset($url_parsed))? geturl($url):'';
    }
}
return $html;
}

?>

Answer by Kensley Sexton

CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an
open_basedir is set,Solution 2:
If the above doesn’t work (it should!) try this:,Set safe_mode = Off in your php.ini file (it’s usually in /etc/ on the server). If that’s already off, then look around for the open_basedir stuff in the php.ini file and comment that line (#open_basedir…). Restart apache server.

Solution 2:
If the above doesn’t work (it should!) try this:

<?php
function geturl($url){

(function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CrawlBot/1.0.0)');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    # required for https urls
    curl_setopt($ch, CURLOPT_MAXREDIRS, 15);     

$html = curl_exec($curl);
$status = curl_getinfo($curl);
curl_close($curl);

if($status['http_code']!=200){
    if($status['http_code'] == 301 || $status['http_code'] == 302) {
        list($header) = explode("rnrn", $html, 2);
        $matches = array();
        preg_match("/(Location:|URI:)[^(n)]*/", $header, $matches);
        $url = trim(str_replace($matches[1],"",$matches[0]));
        $url_parsed = parse_url($url);
        return (isset($url_parsed))? geturl($url):'';
    }
}
return $html;
}

?>

Answer by Elisa Grant

Now, instead of ebay.com loading you will see an error mssg like so:,What does that mean ? On my Chrome, I don’t see ebay.com showing any likewise mssg. Nor, am I getting redirected to any other page.,Powered by Discourse, best viewed with JavaScript enabled,HTTP/1.1 301 Moved Permanently Location: http://www.ebay.com/

Check this weird thing out!
Fire-up your Wamp/Xampp and try this code:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://ebay.com");
curl_setopt($ch, CURLOPT_HEADER, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
$result = preg_replace("#(<s*as+[^>]*hrefs*=s*["'])(?!http)([^"'>]+)(["'>]+)#",'$1http://mydomain.com/$2$3', $result);
echo $result
?>

Answer by Baker McKenzie

curl_errno — Return the last error number,curl_copy_handle — Copy a cURL handle along with all of its preferences,curl_close — Close a cURL session,curl_share_errno — Return the last share curl error number


Don't foget to curl_close($ch); Even if curl_errno($ch) != 0Because if you don't - on Windows this will produce windows-error-report (Program terminated unexpectedly)

Answer by Ander Schroeder

I am using this code :,If you have a helper function for your method chunkText(), define it in one of two ways:,2) use a function similar to ones found on the php curl_setopt page, i.e. http://www.php.net/manual/en/function.curl-setopt.php#95027,But i see error 301 Moved Permanently.

I am using this code :

function getUrl($url) {
if(@function_exists('curl_init')) {
    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CrawlBot/1.0.0)');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    # required for https urls
    curl_setopt($ch, CURLOPT_MAXREDIRS, 15);            
    $site = curl_exec($ch);
    curl_close($ch);
    } else {
    global $site;
    $site = file_get_contents($url);
}
return $site;
};

Answer by Zaid Corona

The above code will output “301 Moved” response because Google has a 301 redirect on the URL in question and our cURL client has not been configured to follow it.,This is a short guide on how to force PHP’s cURL functions to follow a HTTP redirect. By default, cURL will not follow any redirect headers that are sent by the server.,If you add the line above to our original code, you will see that our cURL client now follows Google’s 301 redirect.,Note that you might also receive a 302 header. This all depends on the server and the URL that you are sending a request to.

Take the following PHP example:

//The URL of the page that we want to retrieve.
$url = 'http://google.com';

//Initiate cURL and pass it the URL we want to retrieve.
$ch = curl_init($url);

//Tell cURL to return the output as a string.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Execute the cURL request and return the output to a string.
$response = curl_exec($ch);

//Print out the response to the browser.
echo $response;

In PHP, you can use this option like so:

//Tell cURL that it should follow any redirects.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

An example using PHP:

//Tell cURL that it should only follow 3 redirects at most.
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);

Answer by Josue Bradley

// Executecurl_setopt_array($ch, $options);,//echo curl_errno($ch);,I don’t feel secure knowing my request might be redirected to some place I don’t know., $info = curl_getinfo($ch);

<?php

$curl = curl_init('http://example.org/someredirect');
curl_setopt($curl, CURLOPT_POSTFIELDS, "foo");
curl_setopt($curl, CURLOPT_POST, true);

curl_exec($curl);

?>

Answer by Jeremias Webster

Prerequisites: Run in the command line mode (no timeout settings) Calling CURL multiple times, there may be a problem that the send request failed is possible, and the reason can be a CURL connection …,If the return value of the function or method is a long string or a large number, you can consider returning reference to avoid copying large segments.     Note: PHP manages memory using the…,PHP JSON_ENCODE () function returns object and array problem,Today, I have a particular weird problem when I do an API increment. When I use curl to think Tomcat POST data, Tomcat actually reports an error, my POST data Not correct or available. However, I use …

Add a line of curl_setopt:

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);

Answer by Ariel Mendez

The HyperText Transfer Protocol (HTTP) 301 Moved Permanently redirect status response code indicates that the resource requested has been definitively moved to the URL given by the Location headers. A browser redirects to this page and search engines update their links to the resource (in ‘SEO-speak’, it is said that the ‘link-juice’ is sent to the new URL).,HTTP response status codes,301 Moved Permanently,308 Permanent Redirect

301 Moved Permanently

Утилита cURL — это программа командной строки, часто связанная с дистрибутивами Unix / Linux и операционными системами Mac OSX. Он позволяет отправлять практически любой тип HTTP-запроса через командную строку, что отлично подходит для многих вещей, начиная от отправки данных в REST API и заканчивая загрузкой файлов. HTTP-серверы очень часто возвращают перенаправление 301 или 302 для заданного URL-адреса. Одним из распространенных примеров этого является перенаправление вашего браузера с URL-адреса HTTP на HTTPS, например http://stackabuse.com на https:

Утилита cURL — это программа командной строки, часто связанная с
дистрибутивами Unix / Linux и операционными системами Mac OSX. Он
позволяет отправлять практически любой тип HTTP-запроса через командную
строку, что отлично подходит для многих вещей, начиная от отправки
данных в REST API и заканчивая загрузкой файлов.

HTTP-серверы очень часто возвращают перенаправление 301 или 302 для
заданного URL-адреса. Одним из распространенных примеров этого является
перенаправление вашего браузера с URL-адреса HTTP на HTTPS, например
http://stackabuse.com на https://stackabuse.com . Используя cURL, мы
можем увидеть, как на самом деле выглядит это перенаправление:

 $ curl -i http://stackabuse.com 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:11:32 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Cache-Control: max-age=3600 
 Expires: Thu, 18 Apr 2019 03:11:32 GMT 
 Location: https://stackabuse.com/ 

Обратите внимание, что я использовал -i чтобы он распечатал заголовки
ответа на запрос.

При использовании в сценариях Bash или запуске cURL через командную
строку вручную вы не захотите обрабатывать эти перенаправления вручную,
иначе это может добавить много ненужной логики в ваш сценарий. Из-за
этого cURL предлагает флаг командной строки, который сообщает ему
автоматически следовать перенаправлению и возвращать разрешенную
конечную точку и ее данные:

 $ curl -L [url] 

Выполнение этой команды автоматически обработает любые перенаправления
3XX и получит все данные, возвращаемые результирующим URL.

Вот тот же запрос сверху, но с -L (который является псевдонимом для
--location ) для отслеживания перенаправлений:

 $ curl -iL http://stackabuse.com 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:17:42 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Cache-Control: max-age=3600 
 Expires: Thu, 18 Apr 2019 03:17:42 GMT 
 Location: https://stackabuse.com/ 
 
 HTTP/1.1 200 OK 
 Date: Thu, 18 Apr 2019 02:17:42 GMT 
 Content-Type: text/html; charset=utf-8 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 domain=.stackabuse.com; HttpOnly; Secure 
 Cache-Control: public, max-age=3600 
 Vary: Accept-Encoding 
 P3P: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV" 
 Expires: Thu, 18 Apr 2019 03:17:42 GMT 
 
 <!DOCTYPE html> 
 <html lang="en"> 
 ... 
 </html> 

Обратите внимание: поскольку мы сохранили -i он показал нам заголовки
для каждого из сделанных запросов в дополнение к окончательному HTML,
возвращенному сервером, который был сокращен для краткости.

Ограничение перенаправлений

Но что, если запрашиваемый URL-адрес перенаправляет на другой URL-адрес,
который возвращает перенаправление? Нередко можно выполнить несколько
последовательных перенаправлений, прежде чем попасть в конечный пункт
назначения.

Например, допустим, на моем сервере действуют следующие правила:

  • Перенаправление с HTTP на HTTPS
  • Перенаправить с example.com на www.example.com
  • Перенаправление от / о нас к / о нас
  • Перенаправить с косой черты без косой черты на конечную косую черту

С учетом этих правил, если мы отправим запрос на
http://example.com/about мы получим 4 перенаправления и в конечном
итоге окажемся на https://www.example.com/about-us/ . Хотя на самом
деле это не так много перенаправлений, вы можете себе представить, что
можно встретить гораздо больше.

А что, если два URL-адреса постоянно перенаправляют друг на друга? Тогда
вы застрянете в бесконечном цикле перенаправления. У cURL есть способ
справиться с этим, обеспечив максимальное количество перенаправлений,
которое он будет выполнять, по умолчанию 50. Используя параметр
--max-redirs вы можете установить это число в соответствии с вашим
вариантом использования.

Итак, используя наш вымышленный пример сверху, если мы установим
максимальное количество перенаправлений равным 1, мы увидим такую
ошибку:

 $ curl -iL --max-redirs 1 http://example.com 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:39:59 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Location: https://example.com/about 
 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:39:59 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Location: https://www.example.com/about 
 P3P: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV" 
 
 curl: (47) Maximum (1) redirects followed 

С другой стороны, если вам вообще не нужен лимит, просто установите его
на -1.

Понравилась статья? Поделить с друзьями:
  • Cureit ошибка запуска
  • Cups ошибка печати
  • Crypto key not exist код ошибки 07010405
  • Crypto de ошибка при инициализации криптографической сессии пфр
  • Cryptnet dll ошибка