Antworten Sie mit 200 aus der Nginx-Konfiguration, ohne eine Datei bereitzustellen

122

Ich habe Apache so konfiguriert, dass 200 Antworten zurückgesendet werden, ohne dass eine Datei mit dieser Konfigurationszeile bereitgestellt wird

Redirect 200 /hello

Kann ich das mit Nginx machen? Ich möchte keine Datei bereitstellen, sondern nur, dass der Server mit 200 antwortet (ich protokolliere nur die Anforderung).

Ich weiß, dass ich eine Indexdatei hinzufügen und das Gleiche erreichen kann, aber wenn ich es in der Konfiguration mache, kann eines weniger schief gehen.

Theo
quelle

Antworten:

261

Ja, du kannst

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;
}
Cadmi
quelle
1
Wie füge ich der Antwort eine neue Zeile hinzu? gangnam\nstyle?
Tback
1
@tback natürlich, richtig du bist
Cadmi
4
add_header funktioniert bei mir nicht, da es einen weiteren Header hinzufügt, anstatt den alten 'Content-Type' zu ersetzen. In meiner Antwort habe ich 2 'Content-Type'-Header: $ curl -v localhost / healthcheck / h1_pio> GET / healthcheck / h1_pio HTTP / 1.1> User-Agent: curl / 7.38.0> Host: localhost> Accept: / > <HTTP / 1.1 200 OK <Datum: Dienstag, 11. Oktober 2016, 13:27:53 Uhr GMT <Inhaltstyp: application / octet-stream <Inhaltslänge: 25 <Verbindung: keep-alive <Inhaltstyp: application / json
jmcollin92
1
@ jmcollin92 Ihr Kommentar hat nichts mit der Frage zu tun, die gestellt wurde und auf die die Antwort gegeben wurde. weil du offensichtlich irgendeine Art von Proxy_Pass hast, Fascgi_Pass, was auch immer ... aber ich antworte immer noch location / healthcheck / h1_pio {# proxy_pass blablabla was du brauchst; proxy_hide_header Inhaltstyp; add_header Content-Type application / json; } Stellen
Sie
6
@ jmcollin92 das kann passieren, wenn du einen existierenden default_type woanders deklariert hast. Sie können es überschreiben, indem Sie default_type text/plain;anstelle der add_headerDirektive das Innere des Location-Blocks verwenden .
tjb1982
20

Sie müssen eine 204 verwenden, da Nginx eine 200 ohne Antworttext nicht zulässt. Um eine 204 zu senden, verwenden Sie einfach die return-Direktive an return 204;der entsprechenden Stelle.

Martin Fjordvald
quelle
Wenn Sie versuchen, dies über einen Browser anzuzeigen, sieht es so aus, als hätte er nichts getan. das ist beabsichtigt. Sie haben nichts bedient (204), es wird nichts angezeigt. Um zu beweisen, dass Sie eine 204 bedient haben, verwenden Sie curl.
19.
4

Gemäß den Statuscode-Definitionen möchten Sie, dass es sich um eine 204 und nicht um eine 200 handelt. 200 müssen mit einer Ressource in der Antwort verknüpft sein. Andernfalls würde dies die meisten vernünftigen Browser verwirren. Das andere, das Sie verwenden können, ist 304, das für zwischengespeicherten Inhalt ist.

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

sandroid
quelle
Klar, mach einen 204er, wie mache ich das? Obwohl ich sehr bezweifle, dass jeder Browser von einem leeren Körper verwirrt wird.
Theo
1
Ein leerer Körper ist immer noch eine Antwort mit einem Objekt, z. B. einer leeren index.html. Was Sie gefragt haben, ist eine Antwort von 200, an die keine Ressource angehängt ist (keine Datei geliefert). Was genau unter Nginx zu tun ist, muss ich selbst nachschlagen. Ich habe dies nur einmal unter Apache gemacht und kann mich nicht ohne weiteres erinnern.
Sandroid
304 scheint alle falschen Signale für Dinge wie Debugging und vorübergehende Rückkehr zu senden.
Kzqai
2

Um die Antwort von @Martin Fjordval zu vervollständigen, seien Sie vorsichtig, wenn Sie eine solche Konfiguration verwenden, um einen Gesundheitscheck durchzuführen.

Während ein 204HTTP-Code semantisch perfekt für einen Healthcheck ist (Erfolgsanzeige ohne Inhalt), wird er von einigen Diensten nicht als Erfolg gewertet .

Ich hatte nämlich das Problem mit Google Cloud Load-Balancern .

toadjaune
quelle