HTTPプロトコルでの正しいGETコマンドの書き方とは?

このQ&Aのポイント
  • Perlを使ってリンク集のリンクの存在チェックプログラムを作成しています。しかし、HTTPプロトコルのGETコマンドの書き方に苦戦しています。リクエストのxxxxxの部分の文法がわかりません。サーバーによって条件が異なり、http://から始まるパスか、ドメイン名を除いたパスである必要があります。正しいクエリーURIの記述方法はあるのでしょうか?それとも2回リクエストするしかないのでしょうか。
  • Perlを使用してリンク集のリンクの存在をチェックするプログラムを作成しています。しかし、HTTPプロトコルのGETコマンドの書き方について問題があります。リクエストのxxxxxの部分の文法に関して困っています。サーバーによってhttp://から始まるパスか、ドメイン名を除いたパスであるかの条件が異なる場合があるようです。正しいクエリーURIの書き方はあるのでしょうか?それとも2回リクエストするしか解決策はないのでしょうか。
  • Perlを使用して自分のリンク集のリンクの存在をチェックするプログラムを作成しています。しかし、HTTPプロトコルのGETコマンドの書き方につまずいています。リクエストのxxxxxの部分の文法がわからないのです。サーバーによって条件が異なり、http://から始まるパスか、ドメイン名を除いたパスであるかで異なるようです。正しいクエリーURIの書き方はあるのでしょうか?それとも2回リクエストするしか方法はないのでしょうか。
回答を見る
  • ベストアンサー

HTTP プロトコル(正しい GET コマンドの書き方)

 Perl を使って自分のリンク集のリンクの存在チェックプログラムを作っています。  で、HTTP プロトコルの、こちらが発行するリクエストで "GET xxxxx HTTP/1.0" というのがあると思いますが、この xxxxx の部分の文法でちょっと手間取ってます。  というのも、サーバーによって http:// から始まるパスでなければならない場合と、ドメイン名は除いた純粋なパス("http://www/xxx/" であれば、"/xxx/" ということ)でなければならない場合の2通りがあるんです。  ほとんどのサーバーは両方OKなんですが、一部のサーバーだけがそういう設定になっているようです。  正しいクエリーURIの記述の仕方とかあるんでしょうか。  それとも、やっぱり2回リクエストするしかないんでしょうか。

noname#25358
noname#25358

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.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を参考に付けておきます。

参考URL:
http://www.mars.dti.ne.jp/~torao/rfc/rfc2068-ja.txt
noname#25358
質問者

お礼

 ありがとうございます。  Host: ヘッダのことを知らなくて何か色々悩んでたのです(^_^;  これを付けたらちゃんと動くようになりました。

関連するQ&A

  • HTTP GET

    例1)http://www.goo.ne.jp/index.html 例2)http://www.goo.ne.jp ブラウザにアドレスを入力する時、上記に示した二つの例のどちらでも同じページにアクセスできますが、例2の様にindex.htmlを省略した場合、HTTPのプロトコルにおいて、GET の後のパスは何を指定するのでしょうか? GET ??? HTTP/1.0 ???の部分は何を指定するのですか?

  • HTTPプロトコルについて

    telnetでwww.yahoo.co.jpサーバの80番ポートに接続し、 GET / HTTP/1.1 Host:www.yahoo.co.jp というリクエストをしたところ、画像のようなレスポンスが帰ってきました。 この空行の下にある数字はいったい何なんでしょうか?

  • mod_rewrite的なことをphpで実現させたいが空白ページが表示されてしまう

    www.example.com/ほげほげ にアクセスされたら、 example.com/ほげほげ へ urlをかきかえ、 さらに、 $_SERVER["REQUEST_URI"] がスラッシュで終わる(2個以上のスラッシュも考慮)ときは、これらのスラッシュをとりのぞいたurlへかきかえ、 そして、このurlへ301ステータスコードでリダイレクトさせる(ただし、get methodの場合に限る) というコードをphpで書いたのですが、 なぜか、urlは書き換わらず、空白のページが表示されてしまいます。 どこがいけないのでしょうか? お助けくださいませ。         if ($_SERVER["REQUEST_METHOD"] == "GET"){             #HTTP_HOST (exclude www.)             preg_match_all("/^(www\.)(.*)$/", $_SERVER["HTTP_HOST"],$matches_HTTP_HOST);             if ($matches_HTTP_HOST[1] != ''){                 $bWillBeRedirected = true;                 $strAfterRedirect_HTTP_HOST = $matches_HTTP_HOST[2];             }             else{                 $strAfterRedirect_HTTP_HOST = $_SERVER["HTTP_HOST"]             }             #REQUEST_URI (,which includes query string)             preg_match_all("/^(\/)(.*)(\/+)$/", $_SERVER["REQUEST_URI"],$matches_REQUEST_URI);             if ($matches_REQUEST_URI[3] != ''){                 $bWillBeRedirected = true;                 $strAfterRedirect_Request_URI = $matches_REQUEST_URI[1] . $matches_REQUEST_URI[2];             }             else{                 $strAfterRedirect_Request_URI = $_SERVER["REQUEST_URI"];             }             #redirect with 301 status code if needed             if($bWillBeRedirected){                 #Protocol                 if ($_SERVER["HTTPS"] == "on"){                     $strProtocol = "https";                 }                 else{                     $strProtocol = "http";                 }                 $url = $strProtocol . "://" . $strAfterRedirect_HTTP_HOST . $strAfterRedirect_Request_URI;                                                   header("HTTP/1.1 301 Moved Permanently");                 hearder(”Location: “.$url);                 header(”Connection: close”);             }         }

    • ベストアンサー
    • PHP
  • GETクエリを含むリンクを張るとき・・・

    GETクエリを含むリンク張ったらW3CのValidatorに怒られました。 ”general entity "type" not defined and no default entity” とのことです。 &type=~ というクエリを含むので、&が実体参照の始まりとみなされてしまうようです。 これはどう修正すべきでしょうか。 <a href="URI">にGETクエリを含むURIを用いるのが文法違反なのでしょうか。

  • HTTP GETで認証をする

    すいません。 今Inettransferでhttpコントロールを使いサーバーからファイルをGETする仕組みを作っているのですが、その際サーバーには匿名アクセスを拒否し認証をしたいと思っています。 フォルダにIDとpassを付けてもGETが出来ません。PUTは出来たのですが、どなたか分かる人いませんか? ちなみにEveroneを付けるとGETが出来たので、PATHなどには問題ないです。 With Http1 .Timeout = 60000 .Url = urlSourceFile .get fileBuffer, , "ID", "PASS" If .Status = 200 Then         ~処理する。 エラーコードは、401です。

  • URLを ユーザーがわざとというか間違って / をたくさん 増やした場合

    今日たまたまきがついたのですが http://xxxxx*.com/abc.html  があるとすると http://xxxxx*.com//abc.html  とされてもブラウザで同じページが表示されるのですが リンクを REQUEST_URI でいれていると <a href="/abc*.html">○</a> が <a href="//abc*.html">○</a> になり ブラウザが、 ドメイン削って http://abc*.html みたいな感じで 変なアドレスに解釈するんです(--;) やっぱり、 絶対リンクで SERVER_NAME + REQUEST_URI で つなげるのが普通でしょうか・・・

    • ベストアンサー
    • HTML
  • HTTPプロトコル POSTコマンドを中止させたい

    ちょうどピッタリなカテゴリがなかったので、ここで質問させてください。 ブラウザからサーバに対してファイルをPOSTコマンドでアップロードする場面での話です。 一般的な手法としてformタグとinputタグ(type=file)を組み合わせてmultipart/formなenctypeでアップロードさせる方法を行っているのですが、サーバ側の都合でアップロードを途中でやめたくなった場合はどのような方法がありますか? やめたくなるタイミングはPOSTコマンド&ヘッダの送信中ではなく、ファイル本体をアップロードしているときです。例えば、サーバはブラウザからファイルを受け取り始めたけど、ファイルのサイズが大きすぎるとか何かの理由でサーバ側から止めたくなったら、どうすればよいか?ということです。 これは特定のサーバプラットフォームの話ではなくて、プロトコル上でどのような方法があるか、という回答をお待ちしています。 試しに、止めたくなったときにサーバ側からHTTPコネクションを切ってみました。確かにサーバ→ブラウザ方向へのコネクションは切れた(ハーフクローズ)ようですが、ブラウザ→サーバー方向のコネクションは切れずにブラウザは最後までファイルを送り続けました(chromeで確認)。 何か方法があればよろしくお願いします。

  • Perlで言う、LWP HTTPをPHPで

    PerlでのスクリプトをPHPに移行しようかと考えております。(勉強のため) それで、PerlのモジュールでいうLWPとHTTPに代わるクラスライブラリ(API)は、どれにあたるのでしょうか? 具体的には、LWP::UserAgentとHTTP::Requestです。 ※詳しくは、 my $wa = new LWP::UserAgent; my $req = new HTTP::Request(GET => $url); my $res = $wa->request($req); PHPのドキュメント(http://www.php.net/manual/ja/)を見たのですが、いまいちピンときませんでした。 参考URLで結構ですので、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • HTTPプロトコルについて(文字化け。)

    No.656466の質問「文字化け。」 で「サーバーの設定とは関係ありません。 」 と自身満々に回答してしまったものです。。。 (質問者の方には申し訳ない) 私はHTTPプロトコルはポート80にgetコマンドを送って 単にhtmlデータを受け取るだけだと勘違いしていたのですが No.656466の回答にapacheのconfファイルのAddDefaultCharsetを変更することで 文字コードの判定を行えるような事を書いてあったのですが apacheはAddDefaultCharsetをconfファイルで指定してやることで どういった動作をしてブラウザとやりとりしているのでしょうか? 宜しくお願いします。

  • HTTPレスポンスをUDPにより受け取った場合

    HTTPというプロトコルは、UDPの上でも動かせると聞きました。 そこで、以下のような状況(通常はまずあり得ないのですが)が発生した場合について質問があります。 (1)ユーザがHTTPリクエストを「TCP」で送った。 (2)そのHTTPリクエストに対するレスポンスを「UDP」によって受信した。 このように(1)と(2)でトランスポートプロトコルが異なる場合でも、ユーザはHTTPリクエストに対するレスポンスを無事に受け取ることができるのでしょうか? もしくは、ユーザ側で受信時に何らかの操作が必要になるのでしょうか? 通常あり得ない設定の話で恐縮ですが、気になっているのでご意見お聞かせいただければ幸いです。 よろしくお願い致します。

専門家に質問してみよう