У меня есть настройка конфигурации для обработки кучи запросов GET, которые отображают пиксели, которые отлично работают для обработки аналитики и синтаксического анализа строк запроса для ведения журнала. С дополнительным сторонним потоком данных мне нужно обработать запрос POST на заданный URL-адрес, который имеет JSON в ожидаемом регистрируемом формате внутри тела запроса. Я не хочу использовать вторичный сервер с proxy_pass
и просто хочу записывать весь ответ в связанный файл журнала, как это происходит с запросами GET. Фрагмент кода, который я использую, выглядит следующим образом:
Запрос GET (который отлично работает):
location ^~ /rl.gif {
set $rl_lcid $arg_lcid;
if ($http_cookie ~* "lcid=(.*\S)")
{
set $rl_lcid $cookie_lcid;
}
empty_gif;
log_format my_tracking '{ "guid" : "$rl_lcid", "data" : "$arg__rlcdnsegs" }';
access_log /mnt/logs/nginx/my.access.log my_tracking;
rewrite ^(.*)$ http://my/url?id=$cookie_lcid? redirect;
}
Вот что я пытаюсь сделать: запрос POST (который не работает):
location /bk {
log_format bk_tracking $request_body;
access_log /mnt/logs/nginx/bk.access.log bk_tracking;
}
Curling curl http://myurl/bk -d name=example
дает мне страницу 404, которая не найдена.
Потом попробовал:
location /bk.gif {
empty_gif;
log_format bk_tracking $request_body;
access_log /mnt/logs/nginx/bk.access.log bk_tracking;
}
Керлинг curl http://myurl/bk.gif -d name=example
дает мне 405 Not Allowed
.
Моя текущая версия - nginx/0.7.62
. Мы очень ценим любую помощь в правильном направлении! Спасибо!
ОБНОВЛЕНИЕ Итак, теперь мой пост выглядит так:
location /bk {
if ($request_method != POST) {
return 405;
}
proxy_pass $scheme://127.0.0.1:$server_port/dummy;
log_format my_tracking $request_body;
access_log /mnt/logs/nginx/my.access.log my_tracking;
}
location /dummy { set $test 0; }
Он правильно регистрирует данные публикации, но возвращает 404 на стороне запрашивающего. Если я изменю приведенный выше код, чтобы вернуть 200, например:
location /bk {
if ($request_method != POST) {
return 405;
}
proxy_pass $scheme://127.0.0.1:$server_port/dummy;
log_format my_tracking $request_body;
access_log /mnt/logs/nginx/my.access.log my_tracking;
return 200;
}
location /dummy { set $test 0; }
Затем он правильно возвращает 200
, но больше не записывает данные публикации.
ДРУГОЕ ОБНОВЛЕНИЕ Вроде нашла рабочее решение. Надеюсь, это поможет другим на их пути.
set $test 0;
попытку сделатьreturn 200;
из фиктивного местоположения, для меня он затем возвращает 200, как и ожидалось, и я все еще регистрирую тело. - person Elven Spellmaker   schedule 19.05.2018