使用 nginx 作为 memcached + node.js 的反向代理拦截 404

使用 nginx 作为 memcached + node.js 的反向代理拦截 404

我正在使用 nginx 作为反向代理从 memcached 查找 html 内容,如果不存在,则查找 node.js,如果甚至不存在,node.js 将返回 404。我想做的是拦截并为 node.js 返回的 404 提供自定义页面

问题是 nginx 没有返回正确的 404.html,而是返回默认的。

因此,虽然我可以拦截 404 页面,但 nginx 会提供默认错误页面,而不是 404.html

upstream memcached {
    server 127.0.0.1:11211;
}

error_page 404 /404.html;
location /404.html {
    internal;
}

location @memcached {
    ...
    if ($memcached_request = 1) {
        memcached_pass memcached;
        error_page 404 502 504 = @nodejs;
    }

    if ($memcached_request = 0) {
        error_page 404 502 504 = @nodejs;
    }
}

location @nodejs {
    proxy_pass         http://127.0.0.1:7777;
    ...
    error_page 404 /404.html;
    proxy_intercept_errors on;
    proxy_redirect off;
}

location / {
    try_files $uri $uri/ @memcached;
    error_page 403 = @nodejs;
}

有没有更好的方法来实现“如果不在 memcached 中,则转到 node.js”,而不是 error_page 404 = @fallback?如果没有,有没有办法从最后一个后端捕获 404?

答案1

也许它不想重定向到某个internal位置?如果您再次尝试将其重定向到命名位置会怎样?例如@404

否则,听起来你可能必须启用recursive_error_pages以使您的设置正常工作。

相关内容