Ответить с 200 из конфигурации Nginx без подачи файла


122

Я настроил Apache для отправки ответа 200, не обслуживая файл с этой строкой конфигурации

Redirect 200 /hello

Могу ли я сделать это с Nginx? Я не хочу обслуживать файл, я просто хочу, чтобы сервер ответил 200 (я просто регистрирую запрос).

Я знаю, что могу добавить индексный файл и добиться того же самого, но выполнение этого в конфигурации означает, что есть еще одна вещь, которая может пойти не так.

Ответы:


261

Да, ты можешь

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
как добавить новую строку в ответ? gangnam\nstyle?
Тэб

1
@ Обратно, конечно, верно
cadmi

4
add_header не работает для меня, так как он добавляет другой заголовок вместо замены старого «Content-type». В моем ответе у меня есть 2 заголовка типа контента: $ curl -v localhost / healthcheck / h1_pio> GET / healthcheck / h1_pio HTTP / 1.1> Агент пользователя: curl / 7.38.0> Хост: localhost> Принять: / > <HTTP / 1.1 200 OK <Дата: вторник, 11 октября 2016 г. 13:27:53 GMT <Content-Type: application / octet-stream <Content-Length: 25 <Соединение: keep-alive <Content-Type: application / json
jmcollin92

1
@ jmcollin92 Ваш комментарий не имеет ничего общего с вопросом, который был задан и на который был дан ответ. потому что у вас, очевидно, есть какой-то proxy_pass ,ascgi_pass, что угодно ... но я все еще отвечаю location / healthcheck / h1_pio {# proxy_pass blablabla, что вам нужно; proxy_hide_header Content-Type; add_header Content-Type application / json; } в будущем задайте свой вопрос правильно и в нужном месте
cadmi

6
@ jmcollin92, что может произойти, если у вас есть существующий default_type, объявленный где-то еще. Вы можете переопределить его, используя default_type text/plain;внутри блока location вместо add_headerдирективы.
tjb1982

20

Вам нужно использовать 204, так как Nginx не допустит 200 без тела ответа. Для того, чтобы отправить 204 вы просто использовать директиву возврата к return 204;в соответствующем месте.


Если вы попытаетесь просмотреть это через браузер, похоже, он ничего не сделал. это намеренно Вы ничего не обслуживали (204), ничего не отображается. Чтобы доказать, что вы служили 204, используйте curl.
Jnovack

4

Что касается определений кодов состояния, я полагаю, что вы хотите, чтобы это был 204, а не 200. 200 должны быть с ресурсом в ответе, или я подозреваю, что большинство здравомыслящих браузеров будут смущены этим. Другой, который вы можете использовать, это 304, который предназначен для кэшированного контента.

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


Конечно, сделайте это 204, как мне это сделать? Хотя я очень сомневаюсь, что любой браузер будет смущен пустым телом.
Тео

1
пустое тело все еще является ответом, с объектом, таким как пустой index.html. То, что вы просили, это предоставить ответ 200 без ресурса, прикрепленного к нему (файл не обслуживается). Что касается того, как именно это сделать на nginx, мне нужно поискать это самому, я только один раз делал это на apache и не могу вспомнить от руки.
Сандроид

Кажется, что 304 посылает все неправильные сигналы для отладки и временного возврата.
Kzqai

2

Чтобы завершить ответ @Martin Fjordval, будьте осторожны, если вы используете такую ​​конфигурацию для проверки работоспособности.

Хотя 204HTTP-код семантически идеально подходит для проверки работоспособности (индикация успеха без содержимого), некоторые службы не считают его успешным.

А именно, у меня была проблема с Google Cloud Load-балансировщиками .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.