2014.
07.
30
14:00:02
PHPでURLの存在チェックをやろうと思いましてね。
Google先生で探してみたところ「fopen()」を使うやり方、「file_get_contents()」を使うやり方、
そして「get_headers()」を使うやり方が主流っぽいということが分かりました。
ちなみに、それぞれの関数を使ったURL存在チェックのやり方はこんな感じねφ(--)
■fopen()を使ったやり方
■file_get_contents()を使ったやり方
■get_headers()を使ったやり方
ここまでが前振りです。
個人的にはget_headers()を使ったやり方が一番用途に沿った使い方な気がするので、
get_headers()についてもう少し掘り下げてみました。
まずは「get_headers()」の実行結果を確認するために、こんなコードを実行φ(--)
結果はこんなんでしたφ(--)
セッションIDとかの数値系は適当に変更しています。
見て分かる通り、戻り値となる配列の最初の要素にステータスコードが格納されていますね。
サーバ側にはどんな履歴が残るんだべ(--?と気になったので
サーバ側のアクセスログも確認してみました。
残っていたログはこんなんでしたφ(--)
あら、シンプルですね。
考えてみれば当たり前ですが、ヘッダ情報しか取得していないので、
該当URLのHTMLファイル内で読み込んでいる外部ファイル(JavaScriptやCSSなど)は参照していません。
無許可で他人様のホームページに対して実行する場合、
ちょろっと試す分には問題なさそうですが、連続して行うとバレそうですね。
ちなみにURL以外を指定した場合やサーバからのレスポンスを取得できない場合は「false」が戻ってきます。
例えばこんなコードを実行するとφ(--)
こんな結果になりますφ(--)
「get_headers()」の戻りを参照する場合はご注意くださいね。
例えばこんな比較であれば問題ありませんがφ(--)
こんな比較をすると問題がありますφ(--)
$headerが「false」なので「URL有るよ」なルートに入っちゃうのです。
「一致しない」を条件に比較するときは、例えば
のように、falseかどうかの判断も入れてあげてください。
そんな感じ\(--)/
Google先生で探してみたところ「fopen()」を使うやり方、「file_get_contents()」を使うやり方、
そして「get_headers()」を使うやり方が主流っぽいということが分かりました。
ちなみに、それぞれの関数を使ったURL存在チェックのやり方はこんな感じねφ(--)
■fopen()を使ったやり方
<?php
//対象URL
$url = "http://i-3-i.info/";
$fp = @fopen($url, 'r');
if($fp){
print "URL有るよ";
fclose($fp);
}else{
print "URL無いよ";
}
//対象URL
$url = "http://i-3-i.info/";
$fp = @fopen($url, 'r');
if($fp){
print "URL有るよ";
fclose($fp);
}else{
print "URL無いよ";
}
■file_get_contents()を使ったやり方
<?php
//対象URL
$url = "http://i-3-i.info/";
$contents = @file_get_contents($url);
if($contents){
print "URL有るよ";
}else{
print "URL無いよ";
}
//対象URL
$url = "http://i-3-i.info/";
$contents = @file_get_contents($url);
if($contents){
print "URL有るよ";
}else{
print "URL無いよ";
}
■get_headers()を使ったやり方
<?php
//対象URL
$url = "http://i-3-i.info/";
$header = @get_headers($url);
if($header !== false && !preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
//対象URL
$url = "http://i-3-i.info/";
$header = @get_headers($url);
if($header !== false && !preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
ここまでが前振りです。
個人的にはget_headers()を使ったやり方が一番用途に沿った使い方な気がするので、
get_headers()についてもう少し掘り下げてみました。
まずは「get_headers()」の実行結果を確認するために、こんなコードを実行φ(--)
<?php
//対象URL
$url = "http://i-3-i.info";
$header = @get_headers($url);
var_dump($header);
//対象URL
$url = "http://i-3-i.info";
$header = @get_headers($url);
var_dump($header);
結果はこんなんでしたφ(--)
array(11) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(13) "Server: nginx"
[2]=>
string(35) "Date: Wed, 30 Jul 2014 05:19:07 GMT"
[3]=>
string(23) "Content-Type: text/html"
[4]=>
string(17) "Connection: close"
[5]=>
string(38) "Expires: Thu, 10 Nov 1981 08:52:00 GMT"
[6]=>
string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
[7]=>
string(16) "Pragma: no-cache"
[8]=>
string(56) "Set-Cookie: PHPSESSID=p8a87g3pkjqphga7obiu8q7m2d; path=/"
[9]=>
string(22) "X-Powered-By: PleskLin"
[10]=>
string(18) "MS-Author-Via: DAV"
}
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(13) "Server: nginx"
[2]=>
string(35) "Date: Wed, 30 Jul 2014 05:19:07 GMT"
[3]=>
string(23) "Content-Type: text/html"
[4]=>
string(17) "Connection: close"
[5]=>
string(38) "Expires: Thu, 10 Nov 1981 08:52:00 GMT"
[6]=>
string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
[7]=>
string(16) "Pragma: no-cache"
[8]=>
string(56) "Set-Cookie: PHPSESSID=p8a87g3pkjqphga7obiu8q7m2d; path=/"
[9]=>
string(22) "X-Powered-By: PleskLin"
[10]=>
string(18) "MS-Author-Via: DAV"
}
セッションIDとかの数値系は適当に変更しています。
見て分かる通り、戻り値となる配列の最初の要素にステータスコードが格納されていますね。
サーバ側にはどんな履歴が残るんだべ(--?と気になったので
サーバ側のアクセスログも確認してみました。
残っていたログはこんなんでしたφ(--)
212.205.XX.YY - - [30/Jul/2014:14:19:07 +0900] "GET / HTTP/1.0" 200 91117 "-" "-"
あら、シンプルですね。
考えてみれば当たり前ですが、ヘッダ情報しか取得していないので、
該当URLのHTMLファイル内で読み込んでいる外部ファイル(JavaScriptやCSSなど)は参照していません。
無許可で他人様のホームページに対して実行する場合、
ちょろっと試す分には問題なさそうですが、連続して行うとバレそうですね。
ちなみにURL以外を指定した場合やサーバからのレスポンスを取得できない場合は「false」が戻ってきます。
例えばこんなコードを実行するとφ(--)
<?php
//対象URL
$url = "hogehoge";
$header = @get_headers($url);
var_dump($header);
//対象URL
$url = "hogehoge";
$header = @get_headers($url);
var_dump($header);
こんな結果になりますφ(--)
bool(false)
「get_headers()」の戻りを参照する場合はご注意くださいね。
例えばこんな比較であれば問題ありませんがφ(--)
$header = @get_headers($url);
if(preg_match('#^HTTP/.*\s+[200|302]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
if(preg_match('#^HTTP/.*\s+[200|302]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
こんな比較をすると問題がありますφ(--)
$header = @get_headers($url);
if(!preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
if(!preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
$headerが「false」なので「URL有るよ」なルートに入っちゃうのです。
「一致しない」を条件に比較するときは、例えば
$header = @get_headers($url);
if($header !== false && !preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
if($header !== false && !preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
print "URL有るよ";
}else{
print "URL無いよ";
}
のように、falseかどうかの判断も入れてあげてください。
そんな感じ\(--)/