我知道 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)
}
这不是我想要的,但我要求一个解决方法。如果有人有更好的方法,请继续。