- ベストアンサー
HTTPプロトコルでの正しいGETコマンドの書き方とは?
mitonekoの回答
「正しい」が何を意味するかが問題ですけど(苦笑) 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を参考に付けておきます。
関連する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です。
- 締切済み
- Visual Basic
- 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ファイルで指定してやることで どういった動作をしてブラウザとやりとりしているのでしょうか? 宜しくお願いします。
- ベストアンサー
- その他(OS)
- HTTPレスポンスをUDPにより受け取った場合
HTTPというプロトコルは、UDPの上でも動かせると聞きました。 そこで、以下のような状況(通常はまずあり得ないのですが)が発生した場合について質問があります。 (1)ユーザがHTTPリクエストを「TCP」で送った。 (2)そのHTTPリクエストに対するレスポンスを「UDP」によって受信した。 このように(1)と(2)でトランスポートプロトコルが異なる場合でも、ユーザはHTTPリクエストに対するレスポンスを無事に受け取ることができるのでしょうか? もしくは、ユーザ側で受信時に何らかの操作が必要になるのでしょうか? 通常あり得ない設定の話で恐縮ですが、気になっているのでご意見お聞かせいただければ幸いです。 よろしくお願い致します。
- 締切済み
- その他([技術者向] コンピューター)
お礼
ありがとうございます。 Host: ヘッダのことを知らなくて何か色々悩んでたのです(^_^; これを付けたらちゃんと動くようになりました。