+
23
-

回答

以下 几种可行方案 实现类似效果,取决于你的控制权限和架构:

方案一:在 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;
}

网友回复

我知道答案,我要回答