Q_BASIC
Хранитель порядка
- Регистрация
- 30 Ноя 2013
- Сообщения
- 516
- Реакции
- 1.240
- Автор темы
- #1
Приветствую,
Весь день с этой ошибкой сижу, всё не могу понять почему так выходит.
Делаю автоматическое добавление сайтов в CloudFlare.
Получаем записи домена так:
Функция request:
Тут последним параметром указываем $referer и если он есть, то передаем курлу, а так же записываем в лог всё это. И реферер тоже отдельно записываем в лог.
Смотрим лог:
В отправленных заголовках вроде как есть реферер, но в отдельном поле, где для реферера место выделено пусто!
И ошибка пришла от CF: Invalid Action Token, а она, на сколько я знаю, приходит когда реферер не тот или его вообще нет.
Что с реферером?
Весь день с этой ошибкой сижу, всё не могу понять почему так выходит.
Делаю автоматическое добавление сайтов в CloudFlare.
Получаем записи домена так:
PHP:
$records = $this->request('api/v4/zones/'.$content['result']['id'].'/dns_records?page=1&per_page=100&order=type&direction=asc', array(), false, $headers);
$records = json_decode($records, true);
if($records['success']===false)
{
return 'Ошибка при получении данных домена';
}
Функция request:
PHP:
public function request($url, $data=array(), $return_headers=false, $send_headers=array(), $method=false, $referer=false)
{
$cookie_path = FCPATH.'application/cache/cookie.dat';
if(!$cookie = config_item('cf_cookie') or config_item('cf_cookie')==='')
$cookie = file_get_contents($cookie_path);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://www.cloudflare.com/'.$url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
curl_setopt($curl, CURLOPT_HTTPHEADER, $send_headers);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_USERAGENT, self::$useragent);
if($method)
{
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
}
if($referer)
{
curl_setopt($curl, CURLOPT_REFERER, $referer);
}
if(sizeof($data))
{
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
}
$out = curl_exec($curl);
$info = curl_getinfo($curl);
$return = array();
$return['h'] = substr($out, 0, $info['header_size']);
$return['b'] = substr($out, $info['header_size']);
$return['i'] = $info;
curl_close($curl);
preg_match_all("/Set-Cookie: (.*?)=(.*?);/i",$return['h'],$out_cookie);
$cookie='';
foreach ($out_cookie[1] as $key => $value) {
$cookie .= $value.'='.$out_cookie[2][$key].';';
};
set_config('cf_cookie', $cookie);
file_put_contents($cookie_path, $cookie);
$this->log("URL: https://www.cloudflare.com/{$url};\nRequest headers:\n{$return['i']['request_header']};\n\nReferer: {$referer};\n\nResponse headers:\n{$return['h']};\n\nResponse body:\n{$return['b']};");
if($return_headers) return $return;
else return $return['b'];
}
Тут последним параметром указываем $referer и если он есть, то передаем курлу, а так же записываем в лог всё это. И реферер тоже отдельно записываем в лог.
Смотрим лог:
Код:
2015-07-18 21-09-03 - URL: https://www.cloudflare.com/api/v4/zones/912ebb6a697ac6523653854c34b61f64/dns_records?page=1&per_page=100&order=type&direction=asc;
Request headers:
GET /api/v4/zones/912ebb6a697ac6533653854c34b31f64/dns_records?page=1&per_page=100&order=type&direction=asc HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
Host: www.cloudflare.com
Accept: */*
Cookie: vses2=7guo955gbdk0v986aq5min8c93;__cf_effload=1;
Referer: https://www.cloudflare.com/a/setup/site.ru/step/2
X-ATOK: 1437329340-da25eee3ed4d5443eb3b
X-NewRelic-ID: XOUOVMNRGwcJVlRQBAA=
X-Requested-With: XMLHttpRequest
;
Referer: ;
Response headers:
HTTP/1.1 403 Forbidden
Server: cloudflare-nginx
Date: Sat, 18 Jul 2015 18:09:03 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=de464e74528e5d12cfcba35a94cc85ae21437342942; expires=Sun, 17-Jul-16 18:09:02 GMT; path=/; domain=.cloudflare.com; HttpOnly
Expires: Sun, 25 Jan 1981 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-NewRelic-App-Data: PxQPUl9WCgETUFhQAgMEV0YdFGQHBDcQUQxLA1tMXV1dORYiRBJHDQlqGCYjNxhvHx4ODFJCa0leWFJvTQINEW8QXQFXSlBBEUkJTwFRA1JUGgdPVlMAAQdITFMbEwcEBQEHA1ZeW1QFUQ5VAVwWHlUEVRJUPA==
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
CF-RAY: 208022a5ba1015cb-FRA
;
Response body:
{"success":false,"errors":[{"code":9303,"message":"Invalid Action Token"}],"messages":[],"result":null};
[---[END]---]
В отправленных заголовках вроде как есть реферер, но в отдельном поле, где для реферера место выделено пусто!
И ошибка пришла от CF: Invalid Action Token, а она, на сколько я знаю, приходит когда реферер не тот или его вообще нет.
Что с реферером?