- ベストアンサー
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; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> print $socket "GET $path HTTP/1.0",CRLF,CRLF; を、以下のようにしてみては: print $socket 'GET ', $path, ' HTTP/1.1', CRLF, 'Host: ', $host, CRLF, CRLF; 理由は参考URL。
その他の回答 (2)
他人のふんどしで恐縮ですが補足回答です。 HTTP1.1が必要となるケースはNameVirtualHost等を使っているケースです。要はURLにより振り分け処理を行う場合。ちなみにApache(Webサーバ)単独ですとFQDNに対して行いますが、Layer7まで対応するアプリケーションスイッチであれば、URLそのものに対して振り分けが出来ます。
お礼
補足回答ありがとうございます。
その2つのサイトが当てはまるかはわかりませんが、サイト側でブラウザ等で自動判別してリダイレクトするケースがあるので、そういった処理がされているのではないでしょうか。 どうしてもPC環境と同じものを表示したいのであれば、user_agent等もPCでのアクセスと同等のものを付与しておくべきです。
お礼
回答ありがとうございます。ひとつ勉強になりました。
お礼
回答ありがとうございます。ばっちり指定したサイトを表示する ことができました。HTTP/1.1というのを使わなければならなかった のですね。ありがとうございました。