刚才网络有问题,我跟鱼哥讨论了一下,初步做了一个实现,就是觉得有点囧⋯⋯
server {
listen 9080;
location / {
content_by_lua '
local remote_ip = ngx.req.get_headers()["X-Real-IP"];
if remote_ip == nil then
remote_ip = ngx.var.remote_addr;
end;
ngx.say(remote_ip);
';
}
}
server {
listen 9403;
location / {
return 403;
}
}
server{
listen 8080;
location / {
set $proxy_to '';
access_by_lua '
local client_ip = ngx.req.get_headers()["X-Real-IP"];
if client_ip == nil then
client_ip = ngx.var.remote_addr;
end;
local m = string.match(client_ip, "^192%.168%.56%.%d+$");
if m ~= nil then
ngx.var.proxy_to = "
http://127.0.0.1:9080";
else
ngx.var.proxy_to = "
http://127.0.0.1:9403";
end;
';
proxy_pass $proxy_to;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我这个需求跟鱼哥的有点不一样,对于非匹配网段,其实我希望把它阻挡到外面,所以我原本想把某些匹配的直接return一个403,但是测试发现执行完return 403后,nginx没有结束request,而是继续去执行下面的代码。即使break也不行。所以我现在做了一个比较囧的实现,专门写一个只返回403的server节点。
不知道大家有什么比较好的方案?
PS,我在金山也算比较早开始用C做nginx定制开发的吧⋯⋯只是除了老彭和钟东,未必有人知道。
在 2012年6月8日 下午3:11,agentzh
<age...@gmail.com>写道:
Hello!
2012/6/8 刘鑫 <marc...@gmail.com>:
> 啊,感谢你的详细讲解,那个语法错误刚刚我也发现了,而且我测试了一下,用allow/deny不足以区分来自proxy的访问,目前我的测试代码是这样的:
>
> location / {
> content_by_lua '
> local remote_ip = ngx.req.get_headers()["X-Real-IP"];
> if remote_ip == nil then
> remote_ip = ngx.var.remote_addr;
> end;
> local m = ngx.re.match(remote_ip, "^192\\.168\\.56\\.[0-9]+$");
这一行代码中的正则表达式仍然存在转义的问题。如果你使用 LuaJIT 2.0.0 beta9 以上版本运行你的 Lua 代码的话,会得到下面这一行错误:
[error] 7829\#0: *1 Failed to load Lua inlined code: [string
\"content_by_lua\"]:6: invalid escape sequence near '\"^192'
如果你使用标准 Lua 5.1 是会把 \. 默默地解释为 . 的,而这显然不是你想要的,呵呵。
对非法转义序列的错误检查是 Lua 5.2 和 LuaJIT 2.0.0 beta9+ 引入的新特性。
正如我早先那封邮件中指出的,在这个内联 Lua 代码到 nginx.conf 的上下文中的正确的写法应当是:
local m = ngx.re.match(remote_ip, [[^192\\.168\\.56\\.[0-9]+$]]);
Regards,
-agentzh
--
国难思良将
智拙实验室:
http://zerolabrary.appspot.com/……
劉鑫
March.Liu