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


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

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

document.cookie
document.lastModified

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

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2014/11/18 17:17:35
  • 終了:2014/11/23 20:24:23

回答(3件)

id:language_and_engineering No.1

lang_and_engine回答回数170ベストアンサー獲得回数632014/11/18 20:21:23

ポイント34pt

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

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

  • URL全体を取得します

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

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

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

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

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

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

----

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

  • JavascriptだけでPHPのgetallheadersのようにHTTPヘッダを取得する事はできますか?


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

  • xmlhttp.getAllResponseHeaders();


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

  • new XMLHttpRequest(); req.open('GET', document.location, false); req.send(null); var headers = req.getAllResponseHeaders()
id:wankodon

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

2014/11/23 20:17:25
id:a-kuma3 No.2

a-kuma3回答回数4504ベストアンサー獲得回数18702014/11/19 11:31:12

ポイント33pt

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

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

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

  • Last-Modified …… document.lastModified
  • Cookie …… document.cookie


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

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

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

  • document.contentType = "text/html"
  • document.characterSet = "UTF-8"

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




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

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

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

id:wankodon

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

2014/11/23 20:22:04
id:think49 No.3

think49回答回数7ベストアンサー獲得回数22014/11/22 01:36:18

ポイント33pt

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

  • document.domain
  • document.referrer
  • document.cookie
  • document.lastModified

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

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

id:wankodon

4つ定義されてるのですか。なるほど。
回答どうもありがとうございました。

2014/11/23 20:23:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません