file_get_contents で外部リソースにアクセスする 〜VirtualHost編〜
久々な記事の割には小ネタです。
PHP で他のサーバにあるリソースを HTTP経由でアクセスする場合はいくつか方法があります。- fsockopen でソケットを張って通信する
- PEAR::HTTP_Request をつかう
- cURL関数をつかう
- wget等の外部プロセスを実行する
・・・という時は file関数や file_get_contents関数でサクっとアクセスするのが便利です。
(allow_url_fopen が有効になっていることが前提)
セキュリティ的には色々物議を醸していますけどね。
file_get_contents('http://hoge.example.com/path/to/resource');
で目的が果たせればいいのですが, Webサーバによっては VirtualHost の設定がされていて,
目的のリソースの URI が http://fuga.example.com/path/to/resource の場合もありますよね。
Name-based な VirtualHost だと, hoge.example.com と fuga.example.com は同じ IPアドレスを指すので,
file_get_contents('http://fuga.example.com/path/to/resource');
だと, Hostヘッダを付加しないので VirtualHost の設定によっては意図するリソースにアクセスできない可能性があります。
# どの VirtualHost の設定を使うかは Hostヘッダで判断するので
Hostヘッダを付加するにはどうすればいいか, ですが...
stream_context_create関数でコンテキストリソースを作成することで解決します。
具体的には以下の様にします。
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Host: fuga.example.com\r\n"
)
);
$context = stream_context_create($opts);
$file = file_get_contents('http://fuga.example.com/path/to/resource', false, $context);
これで, file関数や file_get_contents関数で外部サーバへのヘッダ付きリクエストが実現できます。
必要に応じて User-Agent等のヘッダも付与してコンテキストを作成すればよいでしょう。
こんな方法もありますよ, ということで。
しかし, 2番目の引数の false を指定しなければならないところがいかにも PHP らしくて素敵ですねぇ( ´∀`)
補足)
Proxy通さないと外部への HTTPアクセスができない場合は, 以下のオプションを指定してコンテキストを作成すればアクセスできます。
$context = stream_context_create(
array('http' =>
array(
'proxy' => 'tcp://proxy.example.com:8080',
'request_fulluri' => true,
),
)
);
追記)
PHP 5.0.0 以上じゃないとコンテキスト使えませんでした...









Comments