Dostęp do nagłówków HTTP strony internetowej w JavaScript

Jak uzyskać dostęp do nagłówków odpowiedzi HTTP strony za pomocą JavaScript?

Powiązane z to pytanie, który został zmodyfikowany, aby zapytać o dostęp do dwóch konkretnych nagłówków HTTP.

Powiązane:
Jak uzyskać dostęp do pól nagłówka żądania HTTP za pomocą JavaScript?

Author: Community, 2008-10-20

17 answers

Nie można odczytać bieżących nagłówków. Możesz wysłać kolejne żądanie do tego samego adresu URL i odczytać jego nagłówki, ale nie ma gwarancji, że nagłówki są dokładnie równe bieżącemu.


Użyj następującego kodu JavaScript, aby uzyskać wszystkie nagłówki HTTP, wykonując żądanie get:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);
 381
Author: Raja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 12:39:16

Niestety, nie ma API, aby dać ci nagłówki odpowiedzi HTTP dla początkowego żądania strony. To było oryginalne pytanie zamieszczone tutaj. To było wielokrotnie zadawane , ponieważ niektórzy ludzie chcieliby uzyskać rzeczywiste nagłówki odpowiedzi oryginalnego żądania strony bez wydawania kolejnego.


dla żądań AJAX:

Jeśli żądanie HTTP jest wykonane przez AJAX, możliwe jest uzyskanie nagłówków odpowiedzi z getAllResponseHeaders() metoda. On część API XMLHttpRequest. Aby zobaczyć, jak można to zastosować, sprawdź fetchSimilarHeaders() funkcja poniżej. Należy pamiętać, że jest to obejście problemu, który nie będzie niezawodny dla niektórych aplikacji.

myXMLHttpRequest.getAllResponseHeaders();

To nie da Ci informacji o nagłówkach odpowiedzi HTTP oryginalnego żądania strony, ale może być użyte do zgadywania, czym były te nagłówki. Więcej na ten temat opisano dalej.


pobieranie wartości nagłówka z początkowego żądania strony:

To pytanie zostało najpierw zadane kilka wiele lat temu, pytając konkretnie o to, jak dostać się do oryginalnych nagłówków odpowiedzi HTTP dla bieżącej strony (tj. tej samej strony, wewnątrz której javascript był uruchomiony). Jest to zupełnie inne pytanie niż po prostu uzyskanie nagłówków odpowiedzi dla dowolnego żądania HTTP. W przypadku początkowego żądania strony nagłówki nie są łatwo dostępne dla javascript. Czy wartości nagłówków, których potrzebujesz, będą niezawodne i wystarczająco spójne, jeśli ponownie poprosisz o tę samą stronę za pośrednictwem AJAX, będą zależy od konkretnego zastosowania.

Poniżej przedstawiamy kilka propozycji obejścia tego problemu.


1. Żądania dotyczące zasobów, które są w dużej mierze statyczne

Jeśli odpowiedź jest w dużej mierze statyczna, a nagłówki nie powinny się znacznie zmieniać między żądaniami, możesz złożyć żądanie AJAX dla tej samej strony, na której aktualnie jesteś i założyć, że są one tymi samymi wartościami, które były częścią odpowiedzi HTTP strony. Może to umożliwić dostęp do nagłówki potrzebne przy użyciu opisanego powyżej interfejsu API nice XMLHttpRequest.

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);
}

Takie podejście będzie problematyczne, jeśli naprawdę musisz polegać na tym, że wartości są spójne między żądaniami, ponieważ nie możesz w pełni zagwarantować, że są takie same. To będzie zależeć od konkretnej aplikacji i tego, czy wiesz, że wartość, której potrzebujesz, jest czymś, co nie zmieni się z jednego żądania na drugie.


2. Twórz Wnioski

jakieś BOM właściwości (Model obiektu przeglądarki), które przeglądarka określa patrząc na nagłówki. Niektóre z tych właściwości odzwierciedlają bezpośrednio nagłówki HTTP (np. {[8] } jest ustawione na wartość pola nagłówka HTTP User-Agent). Wąchając dostępne właściwości możesz być w stanie znaleźć to, czego potrzebujesz, lub wskazówki wskazujące, co zawiera odpowiedź HTTP.


3. Schowaj je

Jeśli kontrolujesz stronę serwera, możesz uzyskać dostęp do dowolnego nagłówka, który lubisz, gdy konstruujesz pełny odpowiedź. Wartości mogą być przekazywane klientowi ze stroną, przechowywane w jakimś znaczniku lub być może w wbudowanej strukturze JSON. Jeśli chcesz mieć każdy nagłówek żądania HTTP Dostępny dla Twojego javascript, możesz iterację przez nich na serwerze i wysłać je z powrotem jako ukryte wartości w znacznikach. Prawdopodobnie nie jest idealnym rozwiązaniem wysyłanie wartości nagłówków w ten sposób, ale z pewnością możesz to zrobić dla konkretnej wartości, której potrzebujesz. To rozwiązanie jest prawdopodobnie nieefektywne, zbyt, ale byłoby to zadanie, jeśli potrzebowałem tego.

 311
Author: keparo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Za pomocą XmlHttpRequest możesz wyciągnąć bieżącą stronę, a następnie sprawdzić nagłówki http odpowiedzi.

Najlepszym przypadkiem jest wykonanie HEAD żądania, a następnie sprawdzenie nagłówków.

Aby zobaczyć kilka przykładów tego działania, spójrz na http://www.jibbering.com/2002/4/httprequest.html

Tylko moje 2 centy.
 30
Author: Allain Lalonde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 10:38:31

Rozwiązanie z pracownikami serwisu

Pracownicy serwisu mają dostęp do informacji o sieci, które zawierają nagłówki. Dobre jest to, że działa na każdym rodzaju żądania, a nie tylko XMLHttpRequest.

Jak to działa:

  1. Dodaj pracownika serwisu na swojej stronie.
  2. Obserwuj każdą wysyłaną prośbę.
  3. spraw, aby pracownik serwisu fetch spełniał żądanie za pomocą funkcji respondWith.
  4. kiedy nadejdzie odpowiedź, przeczytaj nagłówki.
  5. Wyślij Nagłówki od pracownika serwisu do strony z funkcją postMessage.

Przykład roboczy:

Pracownicy obsługi są trochę skomplikowani do zrozumienia, więc zbudowałem małą bibliotekę, która robi to wszystko. Jest on dostępny na GitHubie: https://github.com/gmetais/sw-get-headers .

Ograniczenia:

    Strona internetowa musi być na HTTPS [10]}przeglądarka musi obsługiwać Service Workers API
  • the zasady tej samej domeny / między domenami są w akcji, podobnie jak w XMLHttpRequest
 26
Author: Gaël Métais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-28 08:50:37

Innym sposobem wysyłania informacji o nagłówku do JavaScript są pliki cookie. Serwer może wyodrębnić wszystkie potrzebne dane z nagłówków żądań i wysłać je z powrotem do nagłówka odpowiedzi Set-Cookie - a Pliki cookie mogą być odczytywane w JavaScript. Jak mówi keparo, najlepiej jest to zrobić tylko dla jednego lub dwóch Nagłówków, a nie dla wszystkich z nich.

 14
Author: savetheclocktower,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 23:34:06

Dla tych, którzy szukają sposobu na przetworzenie wszystkich nagłówków HTTP do obiektu, do którego można uzyskać dostęp jako słownik headers["content-type"], stworzyłem funkcję 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"]
 13
Author: Diego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-09 01:11:13

Nie można uzyskać dostępu do nagłówków http, ale niektóre informacje w nich zawarte są dostępne w DOM. Na przykład, jeśli chcesz zobaczyć referer http (sic), użyj document.referrer. Mogą być inne takie dla innych nagłówków http. Spróbuj googling konkretne rzeczy, które chcesz, jak "HTTP Referer javascript".

Wiem, że to powinno być oczywiste, ale wciąż Szukałem rzeczy takich jak "HTTP Headers javascript", kiedy wszystko, czego naprawdę chciałem, to referer, i nie dostał żadnych użytecznych wyniki. Nie wiem, jak nie zdawałem sobie sprawy, że mogę zadać bardziej konkretne pytanie.

 5
Author: David Winiecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 00:06:00

Jeśli mówimy o nagłówkach Request , możesz utworzyć własne nagłówki podczas wykonywania Xmlhttprequestów.

var request = new XMLHttpRequest();
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.open("GET", path, true);
request.send(null);
 5
Author: Leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-18 15:34:27

Jak wielu ludzi kopałem sieć bez prawdziwej odpowiedzi: (

Mimo to znalazłem bajpas, który mógłby pomóc innym. W moim przypadku w pełni kontroluję mój serwer WWW. W rzeczywistości jest to część mojej aplikacji (patrz odniesienie końcowe). Łatwo jest mi dodać skrypt do mojej odpowiedzi http. Zmodyfikowałem mój serwer httpd, aby wstrzykiwać mały skrypt wewnątrz każdej strony html. Wciskam tylko dodatkowy wiersz 'skrypt js' zaraz po budowie nagłówka, który ustawia istniejącą zmienną z mojego dokumentu w przeglądarce [wybieram lokalizację], ale każda inna opcja jest możliwa. Podczas gdy mój serwer jest napisany w nodejs, nie mam wątpliwości, że ta sama technika może być używana z PHP lub innych.
  case ".html":
    response.setHeader("Content-Type", "text/html");
    response.write ("<script>location['GPSD_HTTP_AJAX']=true</script>")
    // process the real contend of my page

Teraz każda strona html załadowana z mojego serwera, ma ten skrypt uruchamiany przez przeglądarkę w recepcji. Mogę wtedy łatwo sprawdzić z JavaScript, czy zmienna istnieje, czy nie. W moim usecase muszę wiedzieć, czy powinienem używać JSON lub json-P profile, aby uniknąć problemu CORS, ale ta sama technika może być używana do inne cele [ie: wybrać pomiędzy serwerem deweloperskim/produkcyjnym, uzyskać z serwera klucz REST / API itp ....]

W przeglądarce wystarczy sprawdzić zmienną bezpośrednio z JavaScript, jak w moim przykładzie, gdzie go używam, aby wybrać Mój profil 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);

For who ever would like to check my code: https://www.npmjs.org/package/gpsdtracking

 4
Author: Fulup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 12:09:00

Używając mootools, możesz użyć tego.xhr.getAllResponseHeaders ()

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-10 12:37:16

Właśnie przetestowałem i działa to dla mnie przy użyciu Chrome w wersji 28.0.1500.95.

Musiałem pobrać plik i odczytać jego nazwę. Nazwa pliku jest w nagłówku, więc zrobiłem co następuje:

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 ++++++++");

    }
};

Wyjście:

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
 3
Author: rushmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 12:36:20

To jest mój skrypt, aby pobrać wszystkie nagłówki odpowiedzi:

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);

Mając w rezultacie nagłówki odpowiedzi.

Tutaj wpisz opis obrazka

Jest to test porównawczy z wykorzystaniem Hurl.it:

Tutaj wpisz opis obrazka

 3
Author: Jorgesys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 23:40:17

Aby uzyskać nagłówki jako obiekt, który jest bardziej przydatny (poprawa ):

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);
 3
Author: shaedrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 13:16:00

/ Align = "left" / Wystarczy dodać prosty działający kod html tutaj.
działa z każdą rozsądną przeglądarką od wieku plus IE9+ i 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>

Uwaga: otrzymujesz nagłówki drugiego żądania, wynik może różnić się od pierwotnego żądania.


Another way
jest bardziej nowoczesne fetch() API
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
Per caniuse.com to obsługiwane przez Firefox 40, Chrome 42, Edge 14, Safari 11
działający przykładowy kod:
<!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>
 2
Author: j.j.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-30 23:19:54

To stare pytanie. Nie wiem, kiedy wsparcie stało się szersze, ale getAllResponseHeaders() i getResponseHeader() wydają się być teraz dość standardowe: http://www.w3schools.com/xml/dom_http.asp

 0
Author: dlo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-11 12:09:24

Jak już wspomniano, jeśli kontrolujesz stronę serwera, powinno być możliwe wysłanie nagłówków początkowych żądań z powrotem do Klienta w początkowej odpowiedzi.

W Express, na przykład, następujące prace:

app.get('/somepage', (req, res) => { res.render('somepage.hbs', {headers: req.headers}); }) Nagłówki są następnie dostępne w szablonie, więc mogą być ukryte wizualnie, ale zawarte w znacznikach i odczytywane przez javascript klienta.

 -1
Author: Ollie Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 01:58:56

Myślę, że pytanie poszło źle, Jeśli chcesz pobrać nagłówek żądania z JQuery / JavaScript, odpowiedź brzmi po prostu nie. Inne rozwiązania to tworzenie strony aspx lub strony jsp, a następnie możemy łatwo uzyskać dostęp do nagłówka żądania. Weź wszystkie żądania na stronie aspx i umieścić w sesji / cookies następnie można uzyskać dostęp do plików cookie na stronie JavaScript..

 -1
Author: santhos jery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-05 17:02:36