人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JavaScriptで自身が実行されたページのHTTPヘッダをXMLHttpRequestを使わずに任意で取得することはできますでしょうか。

例えばAというページでJavaScriptが実行され、自分自身のAのページのHTTPヘッダを取得したいのです(Aから他のページを取得するわけではないです)。

もし取得出来ない場合、HTTPヘッダで取得できる値は

document.cookie
document.lastModified

以上の2つのみ、ということでよいのでしょうか?
宜しくお願いします。

●質問者: wankodon
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● lang_and_engine
●34ポイント

location.hrefの値なども,いちおうHTTPヘッダの内容に該当すると思いますが・・・。

JavaScriptリファレンス - URL情報(location)操作
http://www.red.oit-net.jp/tatsuya/js/location.htm

XHRを使えばその他も取得できるのですが。

どうして取得できないかというと,Webページの表示が完了した時点で,HTTP通信は終わっているからです。

HTTPヘッダーは「通信行為そのもの」にくっついている物です。通信が終われば用済みになります。

JavaScriptが実行されるタイミングではHTTP通信が既に終わってしまっているので,ヘッダを見たくてもできません。

なので,HTTPヘッダーがほしい場合は,再度あたらしく通信を発生させる,つまりXHRを作ってget/postさせる必要があります。

※HTTPヘッダの内容を観察したいだけなら,Firebugでヘッダの中身を見るといいです。

----

JavascriptだけでPHPのgetallheadersのようにHTTPヘッダを取得する事はできますか? - W3Q
http://w3q.jp/t/5387

逆引きクイックリファレンス JavaScript
http://www.openspc2.org/reibun/QuickReferenceJavaScript/Ajax/007/

JavaScriptでWebページのHTTPヘッダーへのアクセス -- IT専門質問の答え -- 彼山の知識
http://www.freeshow.net.cn/ja/questions/7971f5517ef7d176714c9fc70f3ef2cc15457a04cd7bf40b01300c1dc695704b/


wankodonさんのコメント
遅れましたが、回答ありがとうございました。 てっきりブラウザで保存されているものかと思ったのですが違うのですね。 参考になります。

2 ● a-kuma3
●33ポイント

http://tools.ietf.org/html/rfc7231#section-7
「RFC 7231 Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content」です。
第7章に、「Response Header Fields」が定められています。
Last-Modified が、document.lastModified で取得できます。

あれ?
Cookie がありませんね。 Cookie は、こっちか。
http://tools.ietf.org/html/rfc6265


http://tools.ietf.org/html/rfc7230#section-8.1
「RFC 7230 Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing」の 8.1 には、以下のように記載されています。

8.1. Header Field Registration

HTTP header fields are registered within the "Message Headers"
registry maintained at
<http://www.iana.org/assignments/message-headers/>.


というわけで、IANA のページです。
http://www.iana.org/assignments/message-headers/

HTTP 以外のプロトコルで使うものも、管理されているので、Protocol : http & Status : standard で絞り込んだものがこちら。

Accept、Accept-Charset、Accept-Encoding、Accept-Language、Accept-Ranges、Age、Allow、Authorization、Cache-Control、Connection、Content-Disposition、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-Range、Content-Type、Cookie、DASL、DAV、Date、Depth、Destination、ETag、Expect、Expires、Forwarded、From、Host、If、If-Match、If-Modified-Since、If-None-Match、If-Range、If-Schedule-Tag-Match、If-Unmodified-Since、Last-Modified、Location、Lock-Token、Max-Forwards、MIME-Version、Ordering-Type、Origin、Overwrite、Position、Pragma、Prefer、Preference-Applied、Proxy-Authenticate、Proxy-Authorization、Public-Key-Pins、Public-Key-Pins-Report-Only、Range、Referer、Retry-After、Schedule-Reply、Schedule-Tag、Sec-WebSocket-Accept、Sec-WebSocket-Extensions、Sec-WebSocket-Key、Sec-WebSocket-Protocol、Sec-WebSocket-Version、Server、Set-Cookie、SLUG、Strict-Transport-Security、TE、Timeout、Trailer、Transfer-Encoding、Upgrade、User-Agent、Vary、Via、WWW-Authenticate、Warning

リクエストヘッダに使われるものも混じってますが、見落とすよりは良いでしょう。

というわけで、質問にもあったように、標準的に取得できるのは、以下の二つですね。

「標準的に」と書いたのは、Firefox の場合では、Content-Type ヘッダの内容が、document.contentType と document.characterSet で取得できます。
https://developer.mozilla.org/en-US/docs/Web/API/document
# 実験的と但し書きがありますが

Content-Type: text/html; charset=utf-8

に対して、以下のように取得できます。

直接レスポンスヘッダの値を表している、ということではなく、間接的に取得できるということのようですが。
また、text/plain などの値は、javascript では取得できません(というか、取りようがない)。
# ブラウザのデバッグコンソールからであれば、実行できるけど




HTTP のレスポンスとして、ヘッダとメッセージボディを受け取り、Content-Type に基づいて適切な画面へのレンダリング(だけじゃないけど)を行い、HTML の DOM も作るのがブラウザのお仕事だと思えば、やろうと思えば、全てのヘッダ情報を Document なり、適切なインターフェースを実装したオブジェクトに乗せることはできますが、標準化がやっとできてきた HTML + javascript の規格を変更してまで、実装する必要性がないということでしょう。

例えば、Date なんかは、適切なオブジェクトがない(Document じゃないし、ましてや Window でもない)ので、「通信」に相当するオブジェクトを追加するの、ってところから。

それに、そもそも、404 などのステータスは、javascript で受け取りようがないし(ページがないから)、Location の情報も受け取れません(飛ばされちゃうし)ね。


wankodonさんのコメント
なるほど納得です。こちらで調べても明確な情報がなかったので参考になりました。 回答どうもありがとうございました。

3 ● think49
●33ポイント

HTML Living Standard (HTML5) では次の4つが定義されています。
https://html.spec.whatwg.org/multipage/dom.html#the-document-object

DOM L2 HTML では document.URL もありますね。
http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-1006298752-h2

クライアントサイド言語である以上、参照できるHTTPヘッダが限られているのはどうしようもないと思います。
どうしても必要であれば、XMLHttpRequest せHTTP通信を発生させるか、他のサーバサイドスクリプトと組み合わせるか、になります。


wankodonさんのコメント
4つ定義されてるのですか。なるほど。 回答どうもありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ