2017-10-18 10 views
3

URLが404を返すかどうかを確認する方法があります。 私は以下の機能を使用していますが、うまくいきましたが、私の問題は自分の地域で使用されている言語に応じて、私をサブドメインにリダイレクトするドメインのURLを確認することです。PHP - 最終的なURLが存在するかどうか確認してください

https://example.com/video/123456 

私は、次の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://es.example.com/video/123456 

それはHTTPコード "301" であることを意味し、私の機能は、としてそれを検出し、私はそのビデオが存在しないという答えを与えてくれるが、実際にはそのサブドメインにリダイレクトされたドメインだけが存在する。

$ httpCode < 303の行を$ httpCode < 300に変更すると動作します。

しかし、問題は、それが無効なURLがその主なウェブに私をリダイレクトする受信したときに、このページは、私は404のコードを受信しないと、それは私が何ができる301または303

に役立つだろうということですか?私はうまくやればいいと思う。

+0

'if($ httpCode!= 404)'をチェックするだけで、ページが '404'かどうかを具体的に確認していると思いますか? –

+0

'CURLINFO_REDIRECT_URL'を使ってリダイレクト先を決定し、与えられたURLが有効かどうかを判断することができます。 – Philipp

+0

'CURLOPT_FOLLOWLOCATION'を使ってリダイレクトに従って最終結果を返すのはなぜでしょうか? – Barmar

答えて

2

cURLにすべてのリダイレクトを従わせて、最終リダイレクションの結果を返すように指示できます。使用する:

curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); 
+0

これは正常に動作し、それに加えて、私はカールする1行を追加する必要がありました: ますcurl_setopt($ハンドル、CURLOPT_USERAGENT、 "Mozillaの/ 4.0(互換; MSIE 5.01; Windows NTの5.0)"); – Kokox

+0

特定のウェブサイトに特有のように見えますが、ユーザーエージェントが何かを気にしているとします。 – Barmar

+0

また、HEADリクエストである必要があります。 – Misunderstood

0

あなたはこのページをリダイレクトできるページにリダイレクトすることができるので、再帰的にしたいと思うでしょう。そして、最終ページが存在するかどうかを知りたい。そして、そこに到達するためにどれくらいのリダイレクトが必要になるか分かりません。私はないんだけど他の人があるかもしれません(これは、リダイレクトコードは301と302であることを前提としてい

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

..:

あなたは後に条件付きたい:このような

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

何かをそれに応じてこれを調整してください)。次に、ここでは、あなたが指示されているURLをつかみ、このURLで関数を呼び出すようにします。リダイレクトごとにこれを行います。あなたは、このようにそれを行う場合

しかし、あなたは、あなたがこれを呼ばれてきた回数のような何かを知っているように、第2パラメータを追加することもできます。

function page_404($url, $iteration = 1) 

をですから、後でそれを呼び出すとき

if($iteration > 10) { 
    echo "Too many redirects"; 
    return (some error); 
} 
:非常に最初に、あなたは無限リダイレクトで終わることを確認するチェックを行う、その後

page_404($url, $iteration + 1); 

:、あなたはので、この方法を行います

ほとんどのブラウザでは、10回または15回リダイレクトされるURLに遭遇した場合には痛いでしょう。したがって、これはおそらく安全な数字であり、安全な動作です。そうしないと、誤って構成されたURLにヒットした場合、永遠にリダイレクトされる可能性があります。

関連する問題