Есть такая конфигурация.
location / {
proxy_pass
http://0:5000; }
location = /404 {
root /tmp/nginx;
error_page 404 /404.html;
return 404;
}
location ~* \.(html)$ {
root /tmp/nginx;
error_page 404 /404.html;
}
Бекенд возвращает ответ с "X-Accel-Redirect: /404".
/404 каталога нет и срабатывает error_page 404 и возвращается /404.html страница с 404 HTTP статусом.
Теперь добавим впереди memcached:
location / {
set $memcached_key "test:$uri";
memcached_pass unix:/tmp/memcached.sock;
default_type text/html;
error_page 404 = @fallback;
}
location @fallback {
proxy_pass
http://0:5000; }
location = /404 {
root /tmp/nginx;
error_page 404 /404.html;
return 404;
}
location ~* \.(html)$ {
root /tmp/nginx;
error_page 404 /404.html;
}
И в такой конфигурации, когда бекенд возвращает ответ с "X-Accel-Redirect: /404",
то nginx отдает не /404.html страницу, а свою внутреннюю.
Если же делать сразу "X-Accel-Redirect: /404.html", то не будет 404 статуса.
Какое есть решение для этой ситуации?
Кстати, вызов memcached можно даже убрать, достаточно оставить цепочку из двух error_page.
Такое ощущение, что если в процессе обработки запроса использовался именованный локайшен, то уже не обычные возврата нет.