JavaScriptでWebページのHTTPヘッダーにアクセスする


406

JavaScriptを使用してページのHTTP応答ヘッダーにアクセスするにはどうすればよいですか?

この質問に関連し、2つの特定のHTTPヘッダーへのアクセスについて質問するように変更されました。

関連:
JavaScript経由でHTTPリクエストヘッダーフィールドにアクセスするにはどうすればよいですか?


@ user2284570 —そうではありません。この質問は、要求ヘッダーではなく、応答ヘッダーに関するものです。
クエンティン

回答:


365

現在のヘッダーを読み取ることはできません。同じURLに別のリクエストを作成してそのヘッダーを読み取ることもできますが、ヘッダーが現在のヘッダーと完全に一致することは保証されません。


次のJavaScriptコードを使用して、getリクエストを実行してすべてのHTTPヘッダーを取得します。

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);

58
サイードは、多分質問の作者のための最高の..私はそれがロードされたリソースのヘッダにアクセスしないので、それはだと思うが、新しい要求をする...明らかに彼は最高のを知って、最良の答えが何であるか、そしてそれ自身なされていない
mykhal

18
ヘッダーによっては、「HEAD」動詞を使用したい場合があります。
scottrudy

17
新しいリクエストの作成は、必要なレスポンス値がリクエスト間で同一であることが保証されている場合にのみ機能します。それはあなたのアプリケーションに依存するので、このようなアプローチでのマイレージは異なります。
keparo 2013

6
このハッキングはいくつかのシナリオで機能する可能性がありますが、スクリプトを含むページがPOSTリクエストに応答して生成された場合はまったく機能せず、サーバーでエラーが発生したかどうかを判断しようとしても役に立ちません(HTTP 5XX)元のリクエストの処理中。
クレイメーション2014年

9
この答えはひどく間違っています。正解は「不可能」です。または、この答えに当てはまる場合は、「不可能ですが、これをシミュレートして、まったく機能しない場合もあります」と答えてください。
2015

301

残念ながら、最初のページ要求のHTTP応答ヘッダーを提供するAPIはありません。ここに投稿された元の質問でした。それはされています繰り返し尋ねた一部の人々は別のものを発行せずに元のページ要求の実際のレスポンスヘッダを取得したいと思いますので、あまりにも、。


AJAXリクエストの場合:

HTTPリクエストがAJAXを介して行われる場合、getAllResponseHeaders()メソッドで応答ヘッダーを取得することが可能です。これはXMLHttpRequest APIの一部です。これをどのように適用できるかを確認するには、fetchSimilarHeaders()以下の関数を確認してください。これは、一部のアプリケーションでは信頼できない問題の回避策であることに注意してください。

myXMLHttpRequest.getAllResponseHeaders();

これは、元のページリクエストのHTTP応答ヘッダーに関する情報を提供しませんが、それらのヘッダーが何であるかについて知識に基づいた推測を行うために使用できます。その詳細については、次に説明します。


初期ページ要求からヘッダー値を取得する:

この質問は数年前に最初に尋ねられ、現在のページの元のHTTP応答ヘッダーを取得する方法について具体的に尋ねました(つまり、JavaScriptが実行されているのと同じページ)。これは、任意のHTTP要求の応答ヘッダーを単に取得することとはまったく異なる質問です。最初のページリクエストでは、ヘッダーをJavaScriptで簡単に使用できません。AJAXを介して同じページを再度リクエストした場合に必要なヘッダー値が確実かつ十分に一貫するかどうかは、特定のアプリケーションに依存します。

以下は、その問題を回避するためのいくつかの提案です。


1.ほぼ静的なリソースへのリクエスト

応答がほとんど静的であり、ヘッダーがリクエスト間で大きく変化することが予想されない場合は、現在開いている同じページに対してAJAXリクエストを行い、それらがページの一部であった同じ値であると想定することができますHTTP応答。これにより、上記の素敵なXMLHttpRequest APIを使用して必要なヘッダーにアクセスできるようになります。

function fetchSimilarHeaders (callback) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === XMLHttpRequest.DONE) {
            //
            // The following headers may often be similar
            // to those of the original page request...
            //
            if (callback && typeof callback === 'function') {
                callback(request.getAllResponseHeaders());
            }
        }
    };

    //
    // Re-request the same page (document.location)
    // We hope to get the same or similar response headers to those which 
    // came with the current page, but we have no guarantee.
    // Since we are only after the headers, a HEAD request may be sufficient.
    //
    request.open('HEAD', document.location, true);
    request.send(null);
}

値が同じであることを完全に保証することはできないため、リクエスト間で一貫した値に本当に依存する必要がある場合、このアプローチは問題になります。これは、特定のアプリケーションと、必要な値が1つの要求から次の要求に変更されないものであることを知っているかどうかに依存します。


2.推論する

あり、いくつかのBOMプロパティブラウザはヘッダを見て、判断し(ブラウザオブジェクトモデル)。これらのプロパティの一部は、HTTPヘッダーを直接反映します(たとえばnavigator.userAgent、HTTP User-Agentヘッダーフィールドの値に設定されます)。利用可能なプロパティをスニッフィングすることで、必要なもの、またはHTTP応答に何が含まれているかを示す手掛かりを見つけることができる場合があります。


3.それらを隠します

サーバー側を制御する場合、完全な応答を作成するときに、任意のヘッダーにアクセスできます。値は、ページとともにクライアントに渡され、いくつかのマークアップで、またはおそらくインライン化されたJSON構造で隠されます。すべてのHTTPリクエストヘッダーをJavaScriptで利用できるようにしたい場合は、サーバー上でそれらを繰り返し処理し、マークアップの非表示の値としてそれらを送り返すことができます。この方法でヘッダー値を送信することはおそらく理想的ではありませんが、必要な特定の値に対して確実に送信することができます。このソリューションも間違いなく非効率的ですが、必要に応じて機能します。


2
私はここで説明するなどのGoogleがそれを検出する方法:stackoverflow.com/questions/7191242/...
kamaci

REの更新:ajaxリクエストは、2008年のWeb開発の標準的な部分でもありました-_-
BlueRaja-Danny Pflughoeft

5
BOMは、「ブラウザオブジェクトモデル」の略です。背景については、stackoverflow.com / questions / 2213594 /…を参照してください。
Myrne Stol 2013

1
3)http cookieヘッダーにそれらを隠すこともできます。その後、ドキュメントのマークアップを変更する必要はありません。
skibulk 2014年

:ここで使用する文書の例:アクセスする簡単な方法は、このようなリンク要素としてレスポンスヘッダー要素がありgist.github.com/FunThomas424242/...
FunThomas424242

28

を使用XmlHttpRequestすると、現在のページをプルアップして、応答のhttpヘッダーを調べることができます。

最善のケースは、HEADリクエストを実行してからヘッダーを調べることです。

これを行ういくつかの例については、http: //www.jibbering.com/2002/4/httprequest.htmlを参照してください。

ちょうど私の2セント。


24

サービスワーカーによるソリューション

Service Workerは、ヘッダーを含むネットワーク情報にアクセスできます。良い点は、XMLHttpRequestだけでなく、あらゆる種類のリクエストで機能することです。

使い方:

  1. WebサイトにService Workerを追加します。
  2. 送信されるすべてのリクエストを監視します。
  3. 関数を使用して、サービスワーカーをfetchリクエストにしrespondWithます。
  4. 応答が到着したら、ヘッダーを読み取ります。
  5. Service WorkerからpostMessage関数を含むページにヘッダーを送信します。

作業例:

Service Workerは理解するのが少し複雑なので、これをすべて行う小さなライブラリーを作成しました。github:https : //github.com/gmetais/sw-get-headersで入手できます

制限:

  • ウェブサイトはHTTPSである必要があります
  • ブラウザはService Workers API をサポートする必要があります
  • XMLHttpRequestと同じように、同じドメイン/クロスドメインのポリシーが機能している

12

辞書としてアクセスできるオブジェクトにすべてのHTTPヘッダーを解析する方法を探している人のためにheaders["content-type"]、関数を作成しましたparseHttpHeaders

function parseHttpHeaders(httpHeaders) {
    return httpHeaders.split("\n")
     .map(x=>x.split(/: */,2))
     .filter(x=>x[0])
     .reduce((ac, x)=>{ac[x[0]] = x[1];return ac;}, {});
}

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = parseHttpHeaders(req.getAllResponseHeaders());
// Now we can do:  headers["content-type"]

10

ヘッダー情報をJavaScriptに送信する別の方法は、Cookieを使用することです。サーバーは、要求ヘッダーから必要なデータを抽出して、Set-Cookie応答ヘッダー内に送り返すことができます。CookieはJavaScriptで読み取ることができます。しかし、ケパロが言うように、すべてのヘッダーではなく、1つまたは2つのヘッダーに対してこれを行うのが最善です。


1
このアプローチでも、JSのサーバーを制御する必要があります。その情報をどのようにやり取りしても、コードは突然キャッシュ不可になりました。元のアセットのリクエストの破損を避けるために、その特定のリクエストに対してAPIを作成しないのはなぜですか?
MST 2016

5

リクエストヘッダーの場合は、XmlHttpRequestsを実行するときに独自のヘッダーを作成できます。

var request = new XMLHttpRequest();
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.open("GET", path, true);
request.send(null);

セキュリティ上の理由から、mozillaでリクエストヘッダーを変更することはできません。 mxr.mozilla.org/mozilla1.8.0/source/extensions/xmlextras/base/...
user121196

1
setRequestHeader()メソッドを使用する前にopen()を呼び出す必要があります。developer.mozilla.org/en/...
XP1

1
元の質問では、アクセスはヘッダーを取得することであり、ヘッダーを設定することではありません。
Timo Tijhof、2016

4

httpヘッダーにはアクセスできませんが、ヘッダーで提供される情報の一部はDOMで利用できます。たとえば、httpリファラー(sic)を表示する場合は、document.referrerを使用します。他のhttpヘッダーには、このようなものがあるかもしれません。「httpリファラーjavascript」など、必要な特定のものをグーグルで試します。

私はこれが明白であることを知っていますが、私が本当に望んでいたのはリファラーだけであり、有用な結果が得られなかったときに、 "http headers javascript"のようなものを探し続けました。より具体的なクエリを実行できることに気づかなかった理由がわかりません。


4

多くの人々のように、私は本当の答えなしでネットを掘っています:(

それでも、他の人を助けることができるバイパスを見つけました。私の場合は、Webサーバーを完全に制御しています。実際、それは私のアプリケーションの一部です(最後のリファレンスを参照)。スクリプトをhttp応答に追加するのは簡単です。httpdサーバーを変更して、すべてのhtmlページ内に小さなスクリプトを挿入しました。ヘッダー構成の直後に追加の「jsスクリプト」行をプッシュするだけで、ブラウザー内のドキュメントから既存の変数を設定します(場所を選択します)が、他のオプションも可能です。私のサーバーはnodejsで作成されていますが、同じ手法がPHPや他の方法で使用できることは間違いありません。

  case ".html":
    response.setHeader("Content-Type", "text/html");
    response.write ("<script>location['GPSD_HTTP_AJAX']=true</script>")
    // process the real contend of my page

サーバーからロードされたすべてのhtmlページで、このスクリプトが受信時にブラウザーによって実行されます。その後、変数が存在するかどうかをJavaScriptから簡単に確認できます。私のユースケースでは、CORSの問題を回避するためにJSONまたはJSON-Pプロファイルを使用する必要があるかどうかを知る必要がありますが、同じ手法を他の目的に使用できます[つまり、開発/本番サーバーを選択するか、サーバーからREST / APIを取得しますキーなど...]

ブラウザーでは、例のようにJavaScriptから直接変数を確認するだけでよく、Json / JQueryプロファイルを選択するために使用します。

 // Select direct Ajax/Json profile if using GpsdTracking/HttpAjax server otherwise use JsonP
  var corsbypass = true;  
  if (location['GPSD_HTTP_AJAX']) corsbypass = false;

  if (corsbypass) { // Json & html served from two different web servers
    var gpsdApi = "http://localhost:4080/geojson.rest?jsoncallback=?";
  } else { // Json & html served from same web server [no ?jsoncallback=]
    var gpsdApi = "geojson.rest?";
  }
  var gpsdRqt = 
      {key   :123456789 // user authentication key
      ,cmd   :'list'    // rest command
      ,group :'all'     // group to retreive
      ,round : true     // ask server to round numbers
   };
   $.getJSON(gpsdApi,gpsdRqt, DevListCB);

私のコードをチェックしたい人のために:https : //www.npmjs.org/package/gpsdtracking


3

mootoolsを使用すると、this.xhr.getAllResponseHeaders()を使用できます


3

私はテストしたところ、Chromeバージョン28.0.1500.95を使用して動作します。

ファイルをダウンロードしてファイル名を読む必要がありました。ファイル名はヘッダーにあるので、次のようにしました。

var xhr = new XMLHttpRequest(); 
xhr.open('POST', url, true); 
xhr.responseType = "blob";
xhr.onreadystatechange = function () { 
    if (xhr.readyState == 4) {
        success(xhr.response); // the function to proccess the response

        console.log("++++++ reading headers ++++++++");
        var headers = xhr.getAllResponseHeaders();
        console.log(headers);
        console.log("++++++ reading headers end ++++++++");

    }
};

出力:

Date: Fri, 16 Aug 2013 16:21:33 GMT
Content-Disposition: attachment;filename=testFileName.doc
Content-Length: 20
Server: Apache-Coyote/1.1
Content-Type: application/octet-stream

2

これは、すべての応答ヘッダーを取得するためのスクリプトです。

var url = "< URL >";

var req = new XMLHttpRequest();
req.open('HEAD', url, false);
req.send(null);
var headers = req.getAllResponseHeaders();

//Show alert with response headers.
alert(headers);

結果として、応答ヘッダーを持ちます。

ここに画像の説明を入力してください

これはHurl.itを使用した比較テストです。

ここに画像の説明を入力してください


2

ヘッダーをより便利なオブジェクトとして取得するには(Rajaの回答の改善):

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
headers = headers.split(/\n|\r|\r\n/g).reduce(function(a, b) {
    if (b.length) {
        var [ key, value ] = b.split(': ');
        a[key] = value;
    }
    return a;
}, {});
console.log(headers);

2

Allain Lalondeのリンクが私の一日を作りました。ここに単純な動作するHTMLコードを追加するだけです。
年齢に加えてIE9 +およびPresto-Opera 12以降の適切なブラウザで動作します。

<!DOCTYPE html>
<title>(XHR) Show all response headers</title>

<h1>All Response Headers with XHR</h1>
<script>
 var X= new XMLHttpRequest();
 X.open("HEAD", location);
 X.send();
 X.onload= function() { 
   document.body.appendChild(document.createElement("pre")).textContent= X.getAllResponseHeaders();
 }
</script>

注:2番目のリクエストのヘッダーを取得します。結果は最初のリクエストとは異なる場合があります。


もう一つの方法は
、より現代的であるfetch()API
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
パーcaniuse.comそれは、Firefox 40、クロム42、エッジ14、Safariの11でサポートされています
作業例コード:

<!DOCTYPE html>
<title>fetch() all Response Headers</title>

<h1>All Response Headers with fetch()</h1>
<script>
 var x= "";
 if(window.fetch)
    fetch(location, {method:'HEAD'})
    .then(function(r) {
       r.headers.forEach(
          function(Value, Header) { x= x + Header + "\n" + Value + "\n\n"; }
       );
    })
    .then(function() {
       document.body.appendChild(document.createElement("pre")).textContent= x;
    });
 else
   document.write("This does not work in your browser - no support for fetch API");
</script>

0

これは古い質問です。サポートがより広くなった時期はわかりませんがgetAllResponseHeaders()getResponseHeader()現在はかなり標準的であるようです:http : //www.w3schools.com/xml/dom_http.asp


50
getAllResponseHeaders()およびgetResponseHeader()は、XMLHttpRequestオブジェクトのメソッドです。つまり、ajaxリクエストの場合。これらのメソッドを使用して最初のページのヘッダーを表示することはできません。これは、元の質問が本当に求めていたものだと思います。
asgeo1

-1

すでに述べたように、サーバー側を制御する場合は、初期応答で初期要求ヘッダーをクライアントに送り返すことができるはずです。

たとえば、Expressでは次のように機能します。

app.get('/somepage', (req, res) => { res.render('somepage.hbs', {headers: req.headers}); }) ヘッダーはテンプレート内で使用できるため、視覚的に非表示にできますが、マークアップに含めて、クライアントサイドのJavaScriptで読み取ることができます。


問題は、要求ヘッダーではなく、応答ヘッダーについて尋ねることです。
クエンティン

-1

質問は間違った方法で行ったと思います。JQuery/ JavaScriptからリクエストヘッダーを取得する場合、答えは単純に「いいえ」です。他の解決策は、aspxページまたはjspページを作成することで、リクエストヘッダーに簡単にアクセスできます。aspxページのすべてのリクエストを取得してセッション/ Cookieに入れると、JavaScriptページのCookieにアクセスできます。


1
問題は、応答ヘッダーの読み取りについてです。関連する可能性のある質問のコンテキストでのみリクエストヘッダーについて言及しています。
クエンティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.