Как узнать, на какую страницу перенаправляется URL-адрес в PHP? - PullRequest
0 голосов
/ 07 января 2010

Если у меня есть URL-адрес (например, http://www.foo.com/alink.pl?page=2),, я хочу определить, перенаправляется ли я на другую ссылку. Я также хотел бы узнать окончательный URL-адрес (например, http://www.foo.com/other_link.pl).

Я хочу знать, как это сделать в PHP

Спасибо всем за помощь:)

(больше информации:

Я хочу, чтобы у меня была функция с именем didItDirect ($ url), которая возвращает URL-адрес, на который он перенаправляет, если true, и возвращает тот же URL-адрес, переданный, если false

)

Ответы [ 3 ]

2 голосов
/ 07 января 2010

Если вы используете cURL, вы можете сделать curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL), как описано здесь: http://sg.php.net/manual/en/function.curl-getinfo.php

Пример:

<?php
    $ch = curl_init ('http://www.foo.com/alink.pl?page=2');
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    curl_exec ($ch);

    if (!curl_errno ($ch))
        $url = curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL);

    curl_close ($ch);

    echo $url;
?>
1 голос
/ 07 января 2010

Вам нужно будет выполнить http-запрос к указанному URL и проверить полученные заголовки ответа. Ответ 301 или 302 означает, что это перенаправление. URL перенаправления включен в заголовки ответа и будет выглядеть как Location: <url>.

Обновление: руководство предоставило полезный пример , из которого я собрал это, которое, кажется, работает:

<?php  
function isRedirectUrl($url) {
    $redirectCodes = array(301, 302, 303, 307);

    if ($fp = fopen($url, 'r')) {
        $meta = stream_get_meta_data($fp);

        list($http_version, $code, $message) = explode(' ', $meta['wrapper_data'][0], 3);

        if (in_array(intval($code), $redirectCodes)) {
            foreach ($meta['wrapper_data'] as $header) {
                list($name, $value) = explode(':', $header, 2);

                if ($name == 'Location') {
                    return trim($value);
                }
            }    
        }

        fclose($fp);
    }

    return false;
}

function getCanonicalUrl($url) {
    $ret = $url;
    while ($test = isRedirectUrl($ret)) {
        if ($test) {
            $ret = $test;
        }
    }

    return $ret;
}

var_dump(getCanonicalUrl('http://<url to test>'));
?>
0 голосов
/ 07 января 2010

Это не легко.

Это не невозможно, но это чертовски сложно. Вот как вы можете сделать перенаправление:

Перенаправление заголовка.

Здесь вы запрашиваете «gimmiemypage.php», и вместо того, чтобы отправлять «200 - OK» в качестве статуса, он отправляет заголовок «30? - Перенаправленный» (где? Это 1 или 2). Это действительно легко обнаружить, потому что вам покажет curl. Hurray.

Перенаправление обновления HTML.

Это то место, где вы используете a, и через одну секунду после его анализа браузер перенаправляет вас вперед.

Это сложнее обнаружить, потому что вам нужно специально искать мета-заголовки, поэтому вам нужно будет проанализировать произвольный HTML ( Не используйте регулярные выражения для этого, это было бы плохо ), чтобы найти эти теги , Они должны всегда быть в них, но эти дурацкие разработчики карази могут их скрывать.

Тогда есть перенаправления Javascript. Найти их без оценки JavaScript, чтобы увидеть, что происходит, почти невозможно. Существуют различные способы перенаправления людей в JS, но вы можете поймать их с помощью парсера. Однако, поскольку это JS, вам в конечном итоге потребуется прочитать и оценить все JS, которые вы видите на странице, и включенный JS, и все, что включает в себя ...

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

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