PHP - 检查最终的URL是否存在

时间:2017-10-18 23:01:28

标签: php http url redirect curl

我知道有办法验证网址是否返回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

我被重定向到以下网址:

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

这意味着它是一个http代码&#34; 301&#34;并且我的函数将其检测为重定向,因此给出了视频不存在的答案,但实际上它仅存在于我重定向到该子域的域。

如果我为$ httpCode&lt; 303更改$ httpCode&lt; 300行,它就可以了。

但问题是,当收到无效网址时,此页面会将我重定向到其主网页,因此我没有收到404代码,它会为我提供301或303.

我该怎么办?我希望我做得很好。

2 个答案:

答案 0 :(得分:2)

您可以告诉cURL遵循所有重定向,并从最终重定向返回结果。使用:

curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);

答案 1 :(得分:0)

你可能想要这个递归,因为你可以重定向到一个重定向到页面的页面......好吧,你明白了。并且您想知道最终页面是否存在。并且您事先不知道要到达那里需要多少次重定向。

你需要一个条件后:

$(function() {
  // Get the form.
  var form = $('#form');

  // Get the messages div.
  var formMessages = $('#form-messages');

  // Set up an event listener for the contact form.
  $(form).submit(function(event) {
    // Stop the browser from submitting the form.
    event.preventDefault();
    // Serialize the form data.
    var formData = $(form).serialize();
    // Submit the form using AJAX.
    $.ajax({
        type: 'POST',
        url: 'mail.php',
        data: formData
      })
      .done(function(response) {
        // Make sure that the formMessages div has the 'success' class.
        $(formMessages).removeClass('error');
        $(formMessages).addClass('success');

        // Set the message text.
        $(formMessages).text(response);

        // Clear the form.
        $('#ime').val('');
        $('#email').val('');
        $('#poruka').val('');
      })
      .fail(function(data) {
        // Make sure that the formMessages div has the 'error' class.
        $(formMessages).removeClass('success');
        $(formMessages).addClass('error');

        // Set the message text.
        if (data.responseText !== '') {
          $(formMessages).text(data.responseText);
        } else {
          $(formMessages).text('Oops! An error occured and your message could not be sent.');
        }
      });
  });
});

这样的事情:

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

(这假设重定向代码是301和302 ..可能还有其他我不包括的内容,因此请相应地调整它)。然后在这里,获取您被定向到的URL,然后让该函数使用此URL调用自身。它将为每个重定向执行此操作。

但是,如果你这样做,你可能想要添加第二个参数,这样你就可以知道你称之为的次数,例如:

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

所以当你稍后再打电话时,你会这样做:

function page_404($url, $iteration = 1)

然后,在开始时,请检查以确保您最终进行无限重定向:

page_404($url, $iteration + 1);

如果遇到重定向10或15次的网址,大多数浏览器都会呕吐,因此这可能是一个相当安全的数字,也是一种安全行为。否则,如果您点击配置错误的网址,您最终可能会永远重定向。