JavaScript로 웹 페이지의 HTTP 헤더에 액세스


406

JavaScript를 통해 페이지의 HTTP 응답 헤더에 어떻게 액세스합니까?

이 질문 과 관련하여 두 개의 특정 HTTP 헤더에 액세스하도록 요청되었습니다.

관련 :
JavaScript를 통해 HTTP 요청 헤더 필드에 어떻게 액세스합니까?


@ user2284570 — 그렇지 않습니다. 이 질문은 요청 헤더가 아닌 응답 헤더 에 관한 것 입니다.
Quentin

답변:


365

현재 헤더를 읽을 수 없습니다. 동일한 URL에 다른 요청을하고 헤더를 읽을 수는 있지만 헤더가 현재와 정확히 동일하다는 보장은 없습니다.


get요청 을 수행하여 모든 HTTP 헤더를 가져 오려면 다음 JavaScript 코드를 사용하십시오 .

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

58
Saeed, 아마도 질문 작성자에게는 적합하지 않을 것입니다.로드 된 리소스의 헤더에 액세스하지 않고 새로운 요청을하기 때문일 것입니다. 분명히 그는 최고의 것을 알고, 최고의 답변이 무엇인지, 그리고 스스로 만들었습니다
mykhal

18
어떤 헤더를 사용하는지에 따라 'HEAD'동사를 사용할 수 있습니다.
scottrudy

17
새 요청은 필요한 응답 값이 한 요청에서 다음 요청으로 동일하게 보장되는 경우에만 작동합니다. 응용 프로그램에 따라 다르므로 이와 같은 접근 방식의 마일리지는 다를 수 있습니다.
keparo

6
이 해킹은 일부 시나리오에서 작동 할 수 있지만 POST 요청에 대한 응답으로 스크립트가 포함 된 페이지가 생성 된 경우 전혀 작동하지 않으며 서버에 오류가 발생했는지 확인하려는 경우 도움이되지 않습니다. 원래 요청을 처리하는 동안 (HTTP 5XX).
claymation

9
이 대답은 끔찍하게 잘못되었습니다. 정답은 "불가능하다"입니다. 또는이 답변에 맞추기 위해 "가능하지는 않지만, 당신을 위해 전혀 작동하지 않거나 전혀 작동하지 않을 수있는 시뮬레이션을 시도하는 해킹이 있습니다".
Jan

301

불행히도 초기 페이지 요청에 대한 HTTP 응답 헤더를 제공하는 API는 없습니다. 그게 원래 질문이었습니다. 일부 사람들은 다른 페이지를 발행하지 않고 원래 페이지 요청의 실제 응답 헤더를 얻고 싶어하기 때문에 반복적으로 요청 되었습니다 .


AJAX 요청의 경우 :

HTTP 요청이 AJAX를 통해 이루어진 경우 getAllResponseHeaders()메소드를 사용 하여 응답 헤더를 가져올 수 있습니다. XMLHttpRequest API의 일부입니다. 이것이 어떻게 적용되는지 보려면 fetchSimilarHeaders()아래 기능을 확인하십시오 . 이 문제는 일부 응용 프로그램에서는 신뢰할 수없는 문제에 대한 해결 방법입니다.

myXMLHttpRequest.getAllResponseHeaders();

원본 페이지 요청의 HTTP 응답 헤더에 대한 정보는 제공하지 않지만 해당 헤더가 무엇인지에 대한 정확한 추측을하는 데 사용될 수 있습니다. 이에 대한 자세한 내용은 다음에 설명합니다.


초기 페이지 요청에서 헤더 값 가져 오기 :

이 질문은 몇 년 전에 처음으로 현재 페이지 의 원래 HTTP 응답 헤더를 얻는 방법 (예 : 자바 스크립트가 실행되는 동일한 페이지) 에 대해 구체적으로 묻습니다 . 이것은 단순히 HTTP 요청에 대한 응답 헤더를 얻는 것과는 다른 질문입니다. 초기 페이지 요청의 경우 자바 스크립트에서 헤더를 쉽게 사용할 수 없습니다. 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);
}

이러한 접근 방식은 요청이 동일하다는 것을 완전히 보장 할 수 없기 때문에 요청간에 일관된 값에 의존해야하는 경우 문제가 될 수 있습니다. 특정 응용 프로그램과 필요한 값이 한 요청에서 다음 요청으로 변경되지 않는 값인지 알고 있는지 여부에 따라 다릅니다.


2. 추론하기

있습니다 일부 BOM 속성 브라우저가 헤더를보고 결정 (브라우저 개체 모델). 이러한 속성 중 일부는 HTTP 헤더를 직접 반영합니다 (예 : navigator.userAgentHTTP User-Agent헤더 필드 값으로 설정 ). 사용 가능한 특성을 스니핑하여 필요한 것을 찾거나 HTTP 응답에 포함 된 내용을 나타내는 단서를 찾을 수 있습니다.


3. 그들을 뭉개

서버 측을 제어하면 전체 응답을 구성 할 때 원하는 헤더에 액세스 할 수 있습니다. 값은 페이지와 함께 클라이언트에 전달되어 일부 마크 업 또는 인라인 된 JSON 구조로 저장 될 수 있습니다. 모든 HTTP 요청 헤더를 자바 스크립트에 사용할 수있게하려면 서버에서 해당 헤더를 반복하여 마크 업에서 숨겨진 값으로 다시 보낼 수 있습니다. 이런 식으로 헤더 값을 보내는 것은 이상적이지 않지만 필요한 특정 값에 대해 확실히 할 수 있습니다. 이 솔루션은 논란의 여지가 있지만 비효율적이지만 필요한 경우 작업을 수행합니다.


2
여기 설명 된 것처럼 Google
이이를

RE 업데이트 : 아약스 요청으로 2008 년 웹 개발 방법 다시의 표준이었다 잘 -_-
BlueRaja - 대니 Pflughoeft

5
BOM은 "브라우저 객체 모델"의 약자입니다. 일부 배경 은 stackoverflow.com/questions/2213594/… 를 참조하십시오 .
Myrne Stol

1
3) http 쿠키 헤더에도 숨길 수 있습니다. 그런 다음 문서 마크 업을 변경할 필요가 없습니다.
skibulk

링크 요소와 같은 응답 헤더 요소에 액세스하는 간단한 방법이 있습니다. 여기에서 문서 예제 사용 : gist.github.com/FunThomas424242/…
FunThomas424242


24

서비스 근로자와의 솔루션

서비스 작업자는 헤더를 포함한 네트워크 정보에 액세스 할 수 있습니다. 좋은 부분은 XMLHttpRequest뿐만 아니라 모든 종류의 요청에서 작동한다는 것입니다.

작동 방식 :

  1. 웹 사이트에 서비스 담당자를 추가하십시오.
  2. 전송되는 모든 요청을 확인하십시오.
  3. 서비스 워커 fetch에게 respondWith기능을 사용 하여 요청하십시오 .
  4. 응답이 도착하면 헤더를 읽으십시오.
  5. 서비스 워커의 헤더를 postMessage함수 가있는 페이지로 보냅니다 .

작업 예 :

서비스 근로자는 이해하기가 다소 복잡하므로이 모든 작업을 수행하는 작은 라이브러리를 만들었습니다. : 그것은 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로 보내는 다른 방법은 쿠키를 사용하는 것입니다. 서버는 요청 헤더에서 필요한 모든 데이터를 추출하여 Set-Cookie응답 헤더 내로 다시 보낼 수 있으며 쿠키는 JavaScript로 읽을 수 있습니다. 그러나 keparo가 말했듯이 모든 헤더가 아닌 하나 또는 두 개의 헤더에 대해서만이 작업을 수행하는 것이 가장 좋습니다.


1
이 방법을 사용하려면 JS의 서버를 제어해야합니다. 해당 정보를 어떻게 전달하든 코드가 갑자기 캐시 할 수 없게되었습니다. 원래 자산에 대한 요청이 손상되지 않도록 특정 요청에 대한 API를 만드는 것이 어떻습니까?
MST

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

4

http 헤더에 액세스 할 수 없지만 제공되는 정보 중 일부는 DOM에서 사용할 수 있습니다. 예를 들어 http 참조 자 (sic)를 보려면 document.referrer를 사용하십시오. 다른 http 헤더에는 이와 같은 다른 것들이있을 수 있습니다. "http referer javascript"와 같이 원하는 것을 인터넷 검색해보십시오.

나는 이것이 명백해야한다는 것을 알고 있지만, 내가 정말로 원했던 모든 것이 참조 자 일 때 유용한 "http headers javascript"와 같은 것을 계속 찾고 유용한 결과를 얻지 못했습니다. 더 구체적인 쿼리를 만들 수 있다는 것을 어떻게 알지 못했는지 모르겠습니다.


4

많은 사람들처럼 나는 진정한 대답없이 그물을 파고 왔습니다 :(

그럼에도 불구하고 다른 사람들을 도울 수있는 우회를 찾았습니다. 내 경우에는 웹 서버를 완전히 제어합니다. 사실 그것은 내 응용 프로그램의 일부입니다 (최종 참조 참조). http 응답에 스크립트를 쉽게 추가 할 수 있습니다. 모든 HTML 페이지 내에 작은 스크립트를 삽입하도록 httpd 서버를 수정했습니다. 헤더 생성 직후 추가 '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 's answer 개선 ) :

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>

참고 : 두 번째 요청의 헤더가 표시되며 결과는 초기 요청과 다를 수 있습니다.


또 다른 방법은
더 현대적인 fetch()API
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
caniuse.com 파이어 폭스 (40), 크롬 (42), 에지 (14), 사파리 (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 객체의 메서드입니다. 즉, 아약스 요청입니다. 이 방법을 사용하여 초기 페이지의 헤더를 볼 수는 없습니다. 원래 질문이 실제로 묻는 것입니다.
asgeo1

-1

이미 언급했듯이 서버 측을 제어하면 초기 응답에서 초기 요청 헤더를 클라이언트로 다시 보낼 수 있습니다.

예를 들어 Express에서는 다음이 작동합니다.

app.get('/somepage', (req, res) => { res.render('somepage.hbs', {headers: req.headers}); }) 그런 다음 템플릿 내에서 헤더를 사용할 수 있으므로 시각적으로 숨길 수 있지만 마크 업에 포함되어 클라이언트 측 자바 스크립트에서 읽을 수 있습니다.


질문은 요청 헤더가 아닌 응답 헤더 에 대해 묻는 것 입니다.
Quentin

-1

JQuery / JavaScript에서 요청 헤더를 가져 오려면 대답은 단순히 아니요입니다. 다른 솔루션은 aspx 페이지 또는 jsp 페이지를 생성하면 요청 헤더에 쉽게 액세스 할 수 있습니다. aspx 페이지의 모든 요청을 가져 와서 세션 / 쿠키에 넣은 다음 JavaScript 페이지에서 쿠키에 액세스 할 수 있습니다.


1
질문은 응답 헤더를 읽는 것에 대한 질문입니다 . 관련된 질문과 관련하여 요청 헤더 만 언급합니다.
Quentin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.