以下 几种可行方案 实现类似效果,取决于你的控制权限和架构:
方案一:在 Nginx 内部 实现关键词过滤(推荐)
虽然你说“Nginx 外”,但最合理的方式其实是 在 Nginx 层拦截响应内容(使用 ngx_http_sub_module 或第三方模块如 nginx-lua)。
示例:用 OpenResty(Nginx + Lua)拦截含敏感词的页面
# 安装 OpenResty 后,在 location 中添加:
location / {
proxy_pass http://backend;
body_filter_by_lua_block {
local body = ngx.arg[1]
if body and (string.find(body, "赌博") or string.find(body, "色情")) then
ngx.log(ngx.WARN, "Blocked page containing sensitive keyword")
ngx.arg[1] = "<h1>内容违规,已被屏蔽</h1>"
ngx.arg[2] = true -- 结束输出
ngx.status = 403
end
}
} 缺点:需启用 body_filter,对性能有影响;仅适用于 HTML 文本内容。
方案二:在 应用层 过滤(如 PHP/Node.js/Java)
在你的后端代码中,渲染 HTML 前检查内容是否含敏感词:
// PHP 示例
$output = renderPage(); // 生成 HTML
if (preg_match('/赌博|色情|诈骗/i', $output)) {
http_response_code(403);
exit('内容包含违规信息');
}
echo $output; 优点:精准、可控、性能好 适用:你有后端代码控制权
方案三:用 WAF(Web 应用防火墙)
部署如 ModSecurity + Nginx,通过规则拦截含关键词的响应:
# ModSecurity 规则示例(拦截响应体)
SecRule RESPONSE_BODY "赌博|色情" \
"id:1001,phase:4,deny,status:403,msg:'Blocked sensitive content'" 适合企业级防护 无需改业务代码
替代思路:阻止访问特定 URL 或参数(而非内容)
如果你能预判哪些页面会包含关键词(如 /article?id=123),可在 Nginx 直接拦截:
# 拦截含敏感参数的请求
if ($args ~* "keyword=赌博") {
return 403;
}
# 拦截特定路径
location ~* ^/sensitive/ {
return 403;
} 网友回复


