短縮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 )

最新の記事

プロフィール

流されるままにウェブ業界で仕事しています。
主にLAPP環境でPHPを書いています。
最近はjQueryをよく書いています。