短縮URLの展開
t.toやbit.lyなどの短縮URLを元のURLに展開
stream_context_get_defaultを設定して、get_headersでヘッダを取得。
ストリームコンテキストを設定しない場合の取得したヘッダ
Array
(
[0] => HTTP/1.0 301 Moved Permanently
[Date] => Array
(
[0] => Mon, 01 Oct 2012 00:00:00 GMT
[1] => Mon, 01 Oct 2012 00:00:00 GMT
)
[Location] => http://php.o0o0.jp
[Cache-Control] => private,max-age=300
[Expires] => Mon, 01 Oct 2012 00:00:00 GMT
[Content-Length] => 0
[Server] => Array
(
[0] => tfe
[1] => Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
)
[1] => HTTP/1.1 200 OK
[X-Powered-By] => PHP/5.4.7
[Connection] => close
[Content-Type] => text/html
)
ストリームコンテキストを設定した場合の取得したヘッダ
Array
(
[0] => HTTP/1.0 301 Moved Permanently
[Date] => Mon, 01 Oct 2012 00:00:00 GMT
[Location] => http://php.o0o0.jp
[Cache-Control] => private,max-age=300
[Expires] => Mon, 01 Oct 2012 00:00:00 GMT
[Content-Length] => 0
[Server] => tfe
)
この通り、取得するヘッダの情報に差が生じるので、できるだけ一度の処理が軽く済むようにストリームコンテキストを作成。
PHP
/**
*
* 短縮URLの展開
*
* @param string $short_url
* @return string
*/
function getReplaceWrap($short_url)
{
// HEADを投げて、リダイレクトしない
$default_opts = array(
'http' => array(
'method' => "HEAD",
'max_redirects' => 1
)
);
// ストリームコンテキストを作成
stream_context_get_default($default_opts);
// ヘッダを取得
$h = get_headers($short_url, 1);
if (empty($h['Location'])) {
$original_url = $url;
} else {
$original_url = $h['Location'];
}
return $original_url;
}
サンプル
短縮URLではなく、通常のURLでヘッダを取得すると以下の通り。
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Mon, 01 Oct 2012 00:00:00 GMT
[Server] => Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
[X-Powered-By] => PHP/5.4.7
[Connection] => close
[Content-Type] => text/html
)
ちなみに、存在しないURLのヘッダ。
Array
(
[0] => HTTP/1.1 404 Not Found
[Date] => Mon, 01 Oct 2012 00:00:00 GMT
[Server] => Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
[Connection] => close
[Content-Type] => text/html; charset=iso-8859-1
)