Чтобы подробно остановиться ответ Sparr
, Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.
Думают о нем как это:
Предполагают, что существует 2 функции, вызванные InitializeObject
, и AssignObject
. Когда компилятор видит thing = value
, он смотрит на контекст и называет один InitializeObject
при создании нового thing
. Если Вы не, это вместо этого звонит AssignObject
.
Обычно это прекрасно, поскольку InitializeObject
и AssignObject
обычно ведут себя тот же путь. Кроме тех случаев, когда, имея дело с массивами символов (и несколько других пограничных случаев), в этом случае они ведут себя по-другому. Почему делают это? Хорошо это - целое другое сообщение, включающее стек по сравнению с "кучей" и т. д. и т. п.
пз: Как в стороне, думая это таким образом также поможет Вам понять конструкторов копии и другие такие вещи, если Вы когда-нибудь будете рисковать в C++
Вы должны получить заголовок Location для перенаправленного URL.
Новое место назначения для перенаправления 302 находится в поле заголовка http "местоположение". Пример:
HTTP/1.1 302 Found
Date: Tue, 30 Jun 2002 1:20:30 GMT
Server: Apache
Location: http://www.foobar.com/foo/bar
Content-Type: text/html; charset=iso-8859-1
Просто введите его с помощью регулярного выражения.
Чтобы включить всю информацию заголовка HTTP, включите ее в результат с помощью параметра curl CURLOPT_HEADER . Установите его с помощью:
curl_setopt($c, CURLOPT_HEADER, true);
Если вы просто хотите, чтобы curl следовал за перенаправлением, используйте CURLOPT_FOLLOWLOCATION :
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
В любом случае вы не должны использовать новый URI, потому что код состояния HTTP 302 является только временным перенаправление.
Здесь ' Это способ получить все заголовки, возвращаемые http-запросом curl, а также код состояния и массив строк заголовков для каждого заголовка.
$url = 'http://google.com';
$opts = array(CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_FOLLOWLOCATION => true);
$ch = curl_init();
curl_setopt_array($ch, $opts);
$return = curl_exec($ch);
curl_close($ch);
$headers = http_response_headers($return);
foreach ($headers as $header) {
$str = http_response_code($header);
$hdr_arr = http_response_header_lines($header);
if (isset($hdr_arr['Location'])) {
$str .= ' - Location: ' . $hdr_arr['Location'];
}
echo $str . '<br />';
}
function http_response_headers($ret_str)
{
$hdrs = array();
$arr = explode("\r\n\r\n", $ret_str);
foreach ($arr as $each) {
if (substr($each, 0, 4) == 'HTTP') {
$hdrs[] = $each;
}
}
return $hdrs;
}
function http_response_header_lines($hdr_str)
{
$lines = explode("\n", $hdr_str);
$hdr_arr['status_line'] = trim(array_shift($lines));
foreach ($lines as $line) {
list($key, $val) = explode(':', $line, 2);
$hdr_arr[trim($key)] = trim($val);
}
return $hdr_arr;
}
function http_response_code($str)
{
return substr(trim(strstr($str, ' ')), 0, 3);
}
Используйте curl_getinfo ($ ch)
, и первый элемент ( url
) укажет эффективный URL.