例えばAというページでJavaScriptが実行され、自分自身のAのページのHTTPヘッダを取得したいのです(Aから他のページを取得するわけではないです)。
もし取得出来ない場合、HTTPヘッダで取得できる値は
document.cookie
document.lastModified
以上の2つのみ、ということでよいのでしょうか?
宜しくお願いします。
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/
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 の情報も受け取れません(飛ばされちゃうし)ね。
なるほど納得です。こちらで調べても明確な情報がなかったので参考になりました。
回答どうもありがとうございました。
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通信を発生させるか、他のサーバサイドスクリプトと組み合わせるか、になります。
4つ定義されてるのですか。なるほど。
回答どうもありがとうございました。
遅れましたが、回答ありがとうございました。
2014/11/23 20:17:25てっきりブラウザで保存されているものかと思ったのですが違うのですね。
参考になります。