PHP-проверяет, существует ли конечный URL


Я знаю, что есть способы проверить, возвращает ли URL-адрес 404 или нет. Я использую следующую функцию, и она работает нормально, но моя проблема заключается в том, что я хочу проверить URL домена, который перенаправляет меня на поддомен в зависимости от языка, используемого моим регионом.

function page_404($url) {
    $handle = curl_init($url);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);

    /* Get the HTML or whatever is linked in $url. */
    $response = curl_exec($handle);

    /* Check for 404 (file not found). */
    $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
    curl_close($handle);

    /* If the document has loaded successfully without any redirection or error */
    if ($httpCode >= 200 && $httpCode < 300) {
        echo $httpCode."<br/>";
        return false;
    } else {
        echo $httpCode."<br/>";
        return true;
    }
}

Например:

https://example.com/video/123456

Я перенаправлен на следующий URL:

https://es.example.com/video/123456

Что означает, что это http-код "301", и моя функция обнаруживает его как перенаправление и поэтому дает мне ответьте, что видео не существует, но на самом деле оно существует только в том домене, который я перенаправил на этот поддомен.

Если я изменю строку $httpCode Но проблема в том, что эта страница, когда она получает недопустимый url-адрес, перенаправляет меня на свой основной веб-сайт, поэтому я не получаю код 404, и он будет служить мне 301 или 303.

Что я могу сделать? Надеюсь, у меня все получилось.

2 3

2 ответа:

Вы можете сказать cURL следовать всем перенаправлениям и возвращать результат от окончательного перенаправления. Использование:

curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);

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

Вы хотели бы условное после:

if ($httpCode >= 200 && $httpCode < 300) {

Что-то вроде этого:

} elseif ($httpCode >= 301 && $httpCode <= 302) {

(предполагается, что кодами перенаправления являются 301 и 302.. там могут быть и другие, которые я не включаю, поэтому отрегулируйте это соответственно). Затем здесь возьмите URL-адрес, на который вы направляетесь, а затем вызовите саму функцию с этим URL-адресом. Он будет делать это для каждого перенаправления.

Однако, если вы делаете это таким образом, вы можете добавить второй параметр, чтобы вы знали, сколько раз вы вызывали это, что-то вроде:

function page_404($url, $iteration = 1)

Поэтому, когда вы вызываете его позже, вы делаете это следующим образом:

page_404($url, $iteration + 1);

Затем, в самом начале, сделайте проверку, чтобы убедиться, что вы попали в бесконечный редирект:

if($iteration > 10) {
    echo "Too many redirects";
    return (some error);
}

Большинство браузеров будут блевать, если они сталкиваются с URL-адресом, который перенаправляет 10 или 15 раз, так что это, вероятно, довольно безопасный номер и безопасное поведение. В противном случае, вы можете закончить перенаправление навсегда, если вы нажмете неверно настроенный URL.