Nginx 重写/返回阶段顺序

Nginx 重写/返回阶段顺序

我知道 Nginx 有多个阶段。为什么以下代码片段会提供“200 Host: example.com”而不是转发到 Google?将 Lua 评估为更高或更早的一般有效解决方法是什么?

server
{
    listen 80;
    server_name example.com;

    location /
    {
        rewrite_by_lua_block
        {
            return ngx.redirect('https://www.google.com/', 303)
        }

        default_type text/plain;
        return 200 "Host: $host";
    }
}

乍一看,这可能毫无意义,但我有一种智能方法可以阻止/重定向 Lua 块(或此时包含的 Lua 文件中)中的某些调用。这个模块应该可以正常工作。使用 proxy_pass、alias 等时,它可以正常工作。只有使用 return 200 时它才不起作用。有人有想法吗?

答案1

https://github.com/openresty/lua-nginx-module#rewrite_by_lua

请注意,此处理程序始终运行标准 ngx_http_rewrite_module。

所以return 200总是在之前执行rewrite_by_lua_block

就你的情况而言,你应该坚持rewrite_by_lua_block(未检查)

if condition then
    return ngx.redirect('https://www.google.com/', 303)
else
    ngx.print("Hello");
    return ngx.exit(ngx.HTTP_OK)
end

答案2

感谢 Alexey Ten。


作为中间结论(直到证明不是这样),我必须在 Lua 中实现 return 200,而不是直接使用 Nginx 代码。

        rewrite_by_lua_block {
            -- Will be executed. Can of course be combined with a condition.
            return ngx.redirect('https://www.google.com/', 303)
        }

        content_by_lua_block {
            ngx.header["Content-Type"] = "text/plain"
            ngx.print("Host: "..ngx.var.host)
            return ngx.exit(ngx.HTTP_OK)
        }

这不是我想要的,但我要求一个解决方法。如果有人有更好的方法,请继续。

相关内容