Rispondi con 200 dalla configurazione di Nginx senza pubblicare un file


122

Ho configurato Apache per inviare una risposta 200 senza servire alcun file con questa riga di configurazione

Redirect 200 /hello

Posso farlo con Nginx? Non voglio servire un file, voglio solo che il server risponda con un 200 (sto solo registrando la richiesta).

So di poter aggiungere un file indice e ottenere la stessa cosa, ma farlo nella configurazione significa che c'è una cosa in meno che può andare storto.

Risposte:


261

Si, puoi

location / {
    return 200 'gangnam style!';
    # because default content-type is application/octet-stream,
    # browser will offer to "save the file"...
    # if you want to see reply in browser, uncomment next line 
    # add_header Content-Type text/plain;
}

1
come faccio ad aggiungere una nuova riga alla risposta? gangnam\nstyle?
tback,

1
@tback ovviamente, hai ragione
cadmi

4
add_header non funziona per me in quanto aggiunge un'altra intestazione invece di sostituire il vecchio "tipo di contenuto". Nella mia risposta ho 2 intestazioni "Tipo di contenuto": $ curl -v localhost / healthcheck / h1_pio> GET / healthcheck / h1_pio HTTP / 1.1> User-Agent: curl / 7.38.0> Host: localhost> Accetta: / > <HTTP / 1.1 200 OK <Data: mar, 11 ott 2016 13:27:53 GMT <Content-Type: application / octet-stream <Content-Length: 25 <Connection: keep-alive <Content-Type: application / json
jmcollin92,

1
@ jmcollin92 il tuo commento non ha nulla a che fare con la domanda che è stata posta e alla quale è stata data la risposta. perché ovviamente hai una sorta di proxy_pass, fascgi_pass, qualunque cosa ... ma rispondo ancora a location / healthcheck / h1_pio {# proxy_pass blablabla di cosa hai bisogno; proxy_hide_header Content-Type; add_header Tipo di contenuto application / json; } in futuro, poni la tua domanda correttamente e nella posizione corretta
cadmi,

6
@ jmcollin92 che può succedere se hai un default_type esistente dichiarato da qualche altra parte. Puoi sovrascriverlo usando l' default_type text/plain;interno del blocco posizione al posto della add_headerdirettiva.
17-17

20

È necessario utilizzare un 204 poiché Nginx non consentirà un 200 senza corpo di risposta. Per inviare un 204 è sufficiente utilizzare la direttiva rimpatri per return 204;nella posizione appropriata.


Se provi a visualizzarlo tramite un browser, sembrerà che non abbia fatto nulla. è intenzionale. Non hai servito nulla (204), non mostra nulla. Per provare che hai servito un 204, usa curl.
jnovack,

4

Secondo le definizioni del codice di stato, credo che tu voglia che sia un 204, e non 200. 200 ha bisogno di essere con una risorsa nella risposta, o sospetto che la maggior parte dei browser sani si confonderebbe con questo. L'altro che puoi usare è 304, che è per il contenuto memorizzato nella cache.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


Certo, rendilo un 204, come posso farlo? Anche se dubito fortemente che qualsiasi browser sarà confuso da un corpo vuoto.
Theo

1
un corpo vuoto è ancora una risposta, con un oggetto, ad esempio un index.html vuoto. Quello che hai chiesto è di fornire una risposta 200 senza risorse allegate (nessun file pubblicato). Per quanto riguarda esattamente come farlo su nginx, ho bisogno di cercarlo da solo, l'ho fatto solo una volta su apache e non riesco a ricordare a portata di mano.
sandroid

304 sembra che invierebbe tutti i segnali sbagliati per cose come il debug e i resi temporanei.
Kzqai,

2

Per completare la risposta di @Martin Fjordval, fai attenzione se stai utilizzando una tale configurazione per eseguire un controllo di salute.

Mentre un 204codice HTTP è semanticamente perfetto per un controllo di salute (indicazione di successo senza contenuto), alcuni servizi non lo considerano un successo.

Vale a dire, ho avuto il problema con i bilanciatori del carico di Google Cloud .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.