- ベストアンサー
HTTPプロトコルでの正しいGETコマンドの書き方とは?
- Perlを使ってリンク集のリンクの存在チェックプログラムを作成しています。しかし、HTTPプロトコルのGETコマンドの書き方に苦戦しています。リクエストのxxxxxの部分の文法がわかりません。サーバーによって条件が異なり、http://から始まるパスか、ドメイン名を除いたパスである必要があります。正しいクエリーURIの記述方法はあるのでしょうか?それとも2回リクエストするしかないのでしょうか。
- Perlを使用してリンク集のリンクの存在をチェックするプログラムを作成しています。しかし、HTTPプロトコルのGETコマンドの書き方について問題があります。リクエストのxxxxxの部分の文法に関して困っています。サーバーによってhttp://から始まるパスか、ドメイン名を除いたパスであるかの条件が異なる場合があるようです。正しいクエリーURIの書き方はあるのでしょうか?それとも2回リクエストするしか解決策はないのでしょうか。
- Perlを使用して自分のリンク集のリンクの存在をチェックするプログラムを作成しています。しかし、HTTPプロトコルのGETコマンドの書き方につまずいています。リクエストのxxxxxの部分の文法がわからないのです。サーバーによって条件が異なり、http://から始まるパスか、ドメイン名を除いたパスであるかで異なるようです。正しいクエリーURIの書き方はあるのでしょうか?それとも2回リクエストするしか方法はないのでしょうか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
「正しい」が何を意味するかが問題ですけど(苦笑) RFCに書いてあることが正しいとするならば、(というか、正しいとすべきなんでしょうけれども)、RFC1945(HTTP1.0を規定した文書です。)の3.2.1章によれば、URIの構文は、次の通りです。 * URI = ( absoluteURI | relativeURI ) [ "#" fragment ] * absoluteURI = scheme ":" *( uchar | reserved ) * relativeURI = net_path | abs_path | rel_path * net_path = "//" net_loc [ abs_path ] * abs_path = "/" rel_path * rel_path = [ path ] [ ";" params ] [ "?" query ] これを読む限りでは、あなたの表記のどちらでも、サーバーは受け取ってくれそうなものです。 今は、HTTP/1.1に対応しているサーバーが大部分でしょうから、その場合のURIは、RFC2068の3.2.1章に次のように定義されています。 URI = ( absoluteURI | relativeURI ) [ "#" fragment ] absoluteURI = scheme ":" *( uchar | reserved ) relativeURI = net_path | abs_path | rel_path net_path = "//" net_loc [ abs_path ] abs_path = "/" rel_path rel_path = [ path ] [ ";" params ] [ "?" query ] やはり、どちらの形式でも受け入れることになっています。 ちなみに、HTTP1.1の規定では、Getメソッドの引数にrelativeURIを用いる場合には、Host:ヘッダを付けなくてはならないと規定されているはずです。 ただ・・・冒頭の通り、普通はRFCに書いてあることが正しいはずですが・・・今の場合の正しいという言葉の意味は、「世の中に存在する実装がどうなっているか」がすべてでしょうから、2回リクエストするよりしょうがないのかなと思います。 RFC2068の日本語訳のURLを参考に付けておきます。
お礼
ありがとうございます。 Host: ヘッダのことを知らなくて何か色々悩んでたのです(^_^; これを付けたらちゃんと動くようになりました。