• ベストアンサー

socketを用いたHTTPクライアントで別のサイトが表示されるのはなぜ?

以下のようなプログラムでHTTPクライアントを実現しようとしたの ですが、指定したURL($url)と異なるサイトが表示されてしまう場合 があるのはなぜなのでしょうか?(Yahooのトップサイトなどほとんどの サイトは指定したとおりのサイトが表示されるのですが、Yahooの検索 結果(2番目のURL)や東証トップページ(3番目のURL)などは異なる サイトが表示されます。) #!/usr/bin/perl $url='http://www.yahoo.co.jp/'; #$url='http://search.yahoo.co.jp/search?p=%E6%A0%AA&n=30'; #$url='http://www.tse.or.jp/'; &process; print "Content-type: text/html\n"; print "\n"; print $lines; exit(0); sub process { undef $lines; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)'); print $socket "GET $path HTTP/1.0",CRLF,CRLF; my $headerN = <$socket>; $lines .= $data while read($socket,$data,1024) > 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

> print $socket "GET $path HTTP/1.0",CRLF,CRLF; を、以下のようにしてみては: print $socket 'GET ', $path, ' HTTP/1.1', CRLF, 'Host: ', $host, CRLF, CRLF; 理由は参考URL。

参考URL:
http://www.studyinghttp.net/header#Host
noname#190095
質問者

お礼

回答ありがとうございます。ばっちり指定したサイトを表示する ことができました。HTTP/1.1というのを使わなければならなかった のですね。ありがとうございました。

その他の回答 (2)

noname#45409
noname#45409
回答No.3

他人のふんどしで恐縮ですが補足回答です。 HTTP1.1が必要となるケースはNameVirtualHost等を使っているケースです。要はURLにより振り分け処理を行う場合。ちなみにApache(Webサーバ)単独ですとFQDNに対して行いますが、Layer7まで対応するアプリケーションスイッチであれば、URLそのものに対して振り分けが出来ます。

noname#190095
質問者

お礼

補足回答ありがとうございます。

noname#45409
noname#45409
回答No.1

その2つのサイトが当てはまるかはわかりませんが、サイト側でブラウザ等で自動判別してリダイレクトするケースがあるので、そういった処理がされているのではないでしょうか。 どうしてもPC環境と同じものを表示したいのであれば、user_agent等もPCでのアクセスと同等のものを付与しておくべきです。

noname#190095
質問者

お礼

回答ありがとうございます。ひとつ勉強になりました。

関連するQ&A