Réponse avec 200 de Nginx config sans servir un fichier


122

J'ai configuré Apache pour renvoyer une réponse 200 sans servir de fichier avec cette ligne de configuration

Redirect 200 /hello

Puis-je faire cela avec Nginx? Je ne veux pas servir un fichier, je veux juste que le serveur réponde avec un 200 (je ne fais que consigner la demande).

Je sais que je peux ajouter un fichier d'index et obtenir la même chose, mais le faire dans la configuration signifie qu'il y a une chose de moins qui peut mal tourner.

Réponses:


261

Oui, vous pouvez

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
Comment puis-je ajouter une nouvelle ligne à la réponse? gangnam\nstyle?
Retour

1
@tback bien sûr, tu as raison
cadmi

4
add_header ne fonctionne pas pour moi car il ajoute un autre en-tête au lieu de remplacer l'ancien "Content-type". Dans ma réponse, j'ai 2 en-têtes 'Content-type': $ curl -v localhost / healthcheck / h1_pio> GET / healthcheck / h1_pio HTTP / 1.1> User-Agent: curl / 7.38.0> Hôte: localhost> Accepter: / > <HTTP / 1.1 200 OK <Date: mardi, 11 octobre 2016 13:27:53 GMT <Type de contenu: application / octet-stream <Longueur de contenu: 25 <Connexion: keep-alive <Type de contenu: application / json
Jmcollin92

1
@ jmcollin92 votre commentaire n'a rien à voir avec la question qui a été posée et à laquelle la réponse a été donnée. parce que vous avez évidemment une sorte de proxy_pass, fascgi_pass, peu importe ... mais je réponds quand même à location / healthcheck / h1_pio {# proxy_pass blablabla ce dont vous avez besoin; proxy_hide_header Content-Type; add_header Content-Type application / json; } à l'avenir, posez votre question correctement et au bon endroit
cadmi

6
@ jmcollin92 cela peut arriver si vous avez un type par défaut existant déclaré ailleurs. Vous pouvez la remplacer en utilisant l' default_type text/plain;intérieur du bloc d'emplacement à la place de la add_headerdirective.
tjb1982

20

Vous devez utiliser un 204 car Nginx n'autorisera pas un 200 sans corps de réponse. Pour envoyer un 204, vous utilisez simplement la directive de retour à return 204;l’emplacement approprié.


Si vous essayez de voir ceci à travers un navigateur, vous aurez l’impression que cela n’a rien fait. c'est intentionnel. Vous n'avez rien servi (204), rien ne s'affiche. Pour prouver que vous avez servi un 204, utilisez curl.
Jnovack

4

En ce qui concerne les définitions de code d'état, je pense que vous voulez qu'il s'agisse d'un 204, et non de 200. 200 doivent être associés à une ressource dans la réponse, sinon je crains que la plupart des navigateurs sensés ne s'y perdent. L’autre que vous pouvez utiliser est 304, qui correspond au contenu mis en cache.

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


Bien sûr, faites-en un 204, comment puis-je le faire? Bien que je doute fort que tout navigateur sera confondu par un corps vide.
Theo

1
un corps vide est toujours une réponse, avec un objet, tel qu'un index.html vide. Ce que vous avez demandé, c'est de fournir une réponse 200 sans ressource associée (aucun fichier servi). Pour ce qui est de savoir comment faire exactement cela sur nginx, je dois le rechercher moi-même, je ne l'ai fait qu'une fois sur Apache, et je ne me souviens plus de tout.
sandroid

304 semble envoyer des signaux erronés pour des tâches telles que le débogage et les retours temporaires.
Kzqai

2

Pour compléter la réponse de @Martin Fjordval, faites attention si vous utilisez une telle configuration pour faire un bilan de santé.

Bien qu'un 204code HTTP soit sémantiquement parfait pour un bilan de santé (indication de succès sans contenu), certains services ne le considèrent pas comme un succès.

À savoir, j'ai eu le problème avec Google Cloud Load-Balancers .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.