任意のページを取得するために、ASHさんのスクリプトを使ってい
ます。
ところが、どうにも取得できないページがあります。
ブラウザでは見れるのに、このスクリプトでは取得できません。
ダンプをとってみると、404not foundが返却されます。

想像ですが、この場合のアドレスは、「別名」なのでしょうか?

ブラウザでは見られるのだから、なにか方法があると思いますが、
その方法がわかりません。

ASHさんのスクリプトは、
http://ash.jp/perl/socket_http.htm
にあります。

たとえば、
http://www.icn.ne.jp/~akatuki/furu0.htm
http://www.icn.ne.jp/~furukawa/
は、このスクリプトでは読み取れません。
ここのプロバイダのサーバ上にあるHPは、全てそのようです。
また他のSPでも、このような所があります(少ないようですけど)。


こうなる理由と、対処方法(読み取る方法)をお願いします。


よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> #$http = '1.1';


のシャープを外してないとか。

私が的外れかも。
    • good
    • 0
この回答へのお礼

ありがとうございました。
>私が的外れかも。
どころか、
これをはずしたら、ドンピシャ!
うまくいきました。

コード的に見ると、このサーバーはHTTP1.1しか
サポートしていないということですね。
1.1の判断ではじかれてelse{}を実行したけれど、
「なにそれ?」と、知らん顔されたということでしょう。

とすると、この判断の前にサーバーに、「あんたのVerは?」
って聴いて分岐させるべきだとおもうのですが、
その方法はあるのでしょうか?

お礼日時:2008/09/16 00:56

>この判断の前にサーバーに、「あんたのVerは?」


>って聴いて分岐させるべきだとおもうのですが、
>その方法はあるのでしょうか?

Webサーバに適当なHTTP要求を送信すれば,それに対するWebサーバからのHTTP応答の中にHTTPバージョンを示す値が含まれていますので,それを検査することになります。CGIプログラミングの入門書に解説が載っているでしょう。

ただ,今回のご質問の場合は。
HTTP/1.0のWebサーバ,HTTP/1.1のWebサーバ,ともにそのWebページを取得できればいいという最も基本的なニーズですから,単にHTTP/1.1要求を送信すればよいはずです。

RFC2145「HTTPのバージョン番号の使い方と解釈について」を参照。
http://www.tech-web.net/note/RFC2145.html#version
    • good
    • 0
この回答へのお礼

ありがとうございます。

>Webサーバに適当なHTTP要求を送信すれば,それに対するWebサーバか
>らのHTTP応答の中にHTTPバージョンを示す値が含まれていますので
ダンプを取ってみましたので、404not foundを返したときでも、
ヘッダにそれが含まれているのは知っています。それを抜き出すのは
簡単なのですが、もっとスマートに取得できないかと、思った訳です。

>CGIプログラミングの入門書に解説が載っているでしょう。
私自身、Perlの入門書でHTTPプロトコルについて、Perlとの関連で
書かれたものは知りません。
CGIプログラミングは、特定の言語を指すものではないので、
他の言語の入門書には書いて有るのかも知れませんね。
プロトコルについてはあまりヨク知らないので、Perlに関連した入門書
で、HTTPに関して書かれた書籍があれば、ご紹介願います。

>HTTP/1.0のWebサーバ,HTTP/1.1のWebサーバ,ともにそのWebページを>取得できればいいという最も基本的なニーズですから,単にHTTP/1.1
>要求を送信すればよいはずです。
おっしゃるとうりです。
オリジナルでは、その部分がコメントアウトされていて、上手く
いかなかったことは、 osamuy(No.1)さんのご指摘の通りでした。

>RFC2145「HTTPのバージョン番号の使い方と解釈について」を参照。
>​http://www.tech-web.net/note/RFC2145.html#version
ありがとうございました。
勉強になりました。

お礼日時:2008/09/17 20:11

URL/URIの仕様上は半角チルダ(~)をURLエンコードなしに記述することができません。


また、Perlでは ~ を使用すると自動でU+FF5E(全角チルダ)に変換して
しまうことがあるようです。

~ を %7e にして試してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。

参考になりました。~には注意します。

お礼日時:2008/09/16 00:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

QKENT WEBのWebpatio(http://www.kent-w

KENT WEBのWebpatio(http://www.kent-web.com/bbs/patio.html)を、
この掲示板のデザインの用にカスタマイズしたいのですが、
どのように改造すればできるのでしょうか?

http://mb2.jp/_ztd/


上の掲示板もWebPatioを使っているそうです。

patio.cgiを書き換えるのかな?と思い、いろいろいじってみたんですが「500エラー」ばかりで…。
どうしてもできません。

枠を2重の線にしたいんです。


ほんの少しでもいいので、アドバイスいただけないでしょうか?

すみません。

アドバイスいただけると幸いです。

Aベストアンサー

枠を2重の線ていうことは、単にスタイルシートを入れるだけでよいのでしょうか?
正しくhtml箇所を書き換えれば、500エラーにはならないと思います。
cgiでHTMLページを表示する記述上の注意点は、以下のサイトが参考になります。
http://www.aimix.jp/cgi/acchtmlhint.html

参考URL:http://www.aimix.jp/cgi/acchtmlhint.html

QPerlスクリプトが、ローカルでは実行できるが、HTTP経由では実行できない

現在Perlスクリプトを作成し
サーバにアップしました。

SSHでサーバにログインし

#perl a.cgi
と実行したところ(CGIとして動作させるため。中身はPerlスクリプト)

Content-type: text/html

<html>
<body>
あああああ
</body>
</html>

のようなメッセージが表示され正常に動作しているとおもいます。

しかし、
http://www.hoge.com/a.cgi をURLとしてブラウザ上で実行すると
500 Internal Server Error
になります。

パーミッションは755で正常
Perlのパスは#!/usr/bin/perlとしており、これも正常です。

文字コードはeuc-jp 改行コードLF

サーバはApache/1.3.33
Perlバージョンは5.8.4

自分のパソコン上でperl+HTTPサーバ(httpd)を使うと
HTMLふぁいるとして出力されます。
サーバ上でHTTPを使ってアクセスしたときのみエラーとなります。

このような現象が起こるのですが原因がわかりません。
お願いします。

現在Perlスクリプトを作成し
サーバにアップしました。

SSHでサーバにログインし

#perl a.cgi
と実行したところ(CGIとして動作させるため。中身はPerlスクリプト)

Content-type: text/html

<html>
<body>
あああああ
</body>
</html>

のようなメッセージが表示され正常に動作しているとおもいます。

しかし、
http://www.hoge.com/a.cgi をURLとしてブラウザ上で実行すると
500 Internal Server Error
になります。

パーミッションは755で正常
Perlのパス...続きを読む

Aベストアンサー

>500 Internal Server Error
これは、パーミッションの問題ではなく、実行エラーですよね。
一行目は以下だけですか? よけいなブランク文字やスイッチとか後ろに付いてると、サーバーによってはエラーにされてしまう事があります。
コマンドライン実行では、スイッチ有効なのでエラーにならないから、こういう現象になるのかも。
#!/usr/bin/perl

※ perl cgi覚えたての頃、一行目の後ろにコメントを付けていて、unix系サーバーにアップするとエラーになったのだけど、原因がわからず四苦八苦した覚えが。。。
windows local サーバーでは、一行目を無視してたので気付くのが遅れた。

あとは、実際のスクリプトの方を見ないことには?
なにか、そのサーバーでは使えないモジュールを使うような指定があったりとかしませんか?

QFedoraCore3の/var/www/html/に

x.cgi:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>world</TITLE></HEAD>\n";
print "<BODY>\n";
print "<H2>Hello</H2>\n";
print "<HR>\n";
print "</BODY>\n";
print "</HTML>\n";

を配置して他のPCからこのファイルを読みだしたのですがこのコードがそのまま表示されてしまい
Perlが実行されません

何が原因でしょうか?

Aベストアンサー

namazuとは日本語全文検索システムです。
べんりなので標準で入っているのでは?
私のところにもあります。
ちなみに私はRHL9ですが。

なお、あとは、私に考えられるのは改行コードくらいなんですよねえ。
nkf -Lu x.cgi
で改行コード変更してもダメでしょうか?

あと、/var/log/httpd/error_log
には何とかいてあります?

あんまり力になれずめんぼくないです。

参考URL:http://www.namazu.org/

Qhttp://から始まるファイルの更新日時を取得するには

自分のサーバー内にあるファイルの最終更新日時は
statを使って取得できるようですが、
http://から始まるほかのサーバーにあるファイルの
更新日時を取得するにはどうすればいいのでしょうか?
よろしくお願いします。

Aベストアンサー

通常、ブラウザなんかで
http://~/hogehoge.htm
というようにアクセスすると、HTTPサーバーは目的のデータの中身をクライアント(ブラウザ)に返す前にヘッダを付けてきます。

ヘッダの例↓
HTTP/1.1 206 Partial Content
Server: Apache
Last-Modified: Sun, 01 Jan 2006 00:00:00 GMT
Content-Length: 12345

で、このヘッダにLast-Modifiedという名前でその目的のデータ(ファイル)の更新日時を教えてくれていますので、これを取得すれば最終更新日を知ることができます。
但し、相手のHTTPサーバーによってはこの情報を付加していなかったり、嘘の日時情報を付加したりするので必ずしも正しい日時とは限りません。
また、タイムゾーンにも注意する必要があります。
例の場合はGMT(世界標準時刻)ですので日本時間に直すには自分で+9時間してやらないといけません。


おすすめ情報