使用CURL重定向php脚本


Redirect php script using CURL

我正在尝试做一个重定向php脚本,我希望该脚本检查链接是否存在,然后将用户重定向到链接,如果它不存在,那么它将获得下一个链接等等,但由于某种原因不工作,也许你可以给我一些帮助。

<?php
$URL = 'http://www.site1.com';
$URL = 'http://www.site2.com';
$URL = 'http://www.site3.com';
$handlerr = curl_init($URL);
curl_setopt($handlerr,  CURLOPT_RETURNTRANSFER, TRUE);
$resp = curl_exec($handlerr);
$ht = curl_getinfo($handlerr, CURLINFO_HTTP_CODE);
if ($ht == '404')
{ echo "Sorry the website is down atm, please come back later!";}
else { header('Location: '. $URL);}
?>

您正在覆盖您的$URL变量…

$URL = 'http://www.site1.com';
$URL = 'http://www.site2.com';
$URL = 'http://www.site3.com';

将这些url放在一个数组中,并使用for each循环遍历它。

您的代码中有几个问题。对于1,您的$URL将覆盖自己,导致那里只有1个URL。它需要是一个数组:

array( 'http://www.site1.com', 'http://www.site2.com', 'http://www.site3.com' );

你可以得到很多响应,而不仅仅是一个404,所以你应该告诉cURL遵循重定向。如果URL本身是重定向,则可以获得重定向到200的301。所以我们要遵循这个

试试这个:

<?php
function curlGet($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $output = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ( $httpcode == 200 ) {
        return true;
    }
    return false;
}
$urlArray = array( 'http://www.site1.com', 'http://www.site2.com', 'http://www.site3.com' );
foreach ( $urlArray as $url ) {
    if ( $result = curlGet($url) ) {
        header('Location: ' . $url);
        exit;
    }
}
// if we made it here, we looped through every url
// and none of them worked
echo "No valid URLs found...";

http://php.net/manual/en/function.file-exists.php#74469

<?php
function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
?>

这将给你url是否存在检查。

检查多个url,你需要一个数组:

<?
$url_array = [];
$url_array[] = 'http://www.site1.com';
$url_array[] = 'http://www.site2.com';
$url_array[] = 'http://www.site3.com';
foreach ($url_array as $url) {
    if url_exists($url){
        // do what you need;
        break;
    }
}
?>

PS -这是完全未经测试的,但理论上应该做你需要的。