You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为App Engine API配置防火墙,仅允许指定网站与IP访问

解决App Engine Flex API的IP与网站访问限制问题

我完全懂你的需求——既要锁定特定IP访问,又要让指定网站能调用API,还不想用密钥认证(毕竟前端公开的话密钥太容易泄露了)。下面分两步给你落地解决方案:

一、配置IP地址防火墙

这部分你已经查过相关文档,我直接给你实操步骤:

  • 用gcloud命令添加允许特定IP的规则(优先级要设得比默认规则高,确保先匹配):
    gcloud app firewall-rules create 100 --action allow --source-range 1.2.3.4 --description "Allow trusted IP"
    
  • 再把默认规则设为拒绝所有未被允许的IP:
    gcloud app firewall-rules update default --action deny
    
    嫌命令行麻烦的话,也可以直接去Google Cloud控制台的App Engine -> 防火墙页面手动配置,可视化操作更直观。

二、限制仅允许foo.com发起请求

防火墙没法直接校验请求来源的网站,这一步得在你的API代码里做Referer请求头校验:

  • 核心逻辑:每次请求进来时,检查Referer头的值是否属于foo.com(包括它的子域名,比如www.foo.com)。
  • 给你写个Go语言的示例(毕竟你看的是Go相关文档):
    func apiHandler(w http.ResponseWriter, r *http.Request) {
        referer := r.Referer()
        // 定义允许的域名列表
        allowedDomains := []string{"foo.com", "www.foo.com"}
        isDomainAllowed := false
        for _, domain := range allowedDomains {
            if strings.Contains(referer, domain) {
                isDomainAllowed = true
                break
            }
        }
        // 同时兼容IP校验:要么是指定IP,要么是允许的域名来源
        clientIP := strings.Split(r.RemoteAddr, ":")[0] // 提取IP部分,去掉端口
        if !isDomainAllowed && clientIP != "1.2.3.4" {
            w.WriteHeader(http.StatusForbidden)
            fmt.Fprintf(w, "Access denied: unauthorized source")
            return
        }
        // 正常处理API请求逻辑
        fmt.Fprintf(w, "Request processed successfully")
    }
    
  • 注意点:
    • Referer头可能被部分浏览器或代理禁用,如果你的API是给特定前端用的,可以提前和前端团队确认浏览器设置,或者给这种情况留个IP兜底的口子。
    • 虽然Referer存在被伪造的可能,但对于前端公开的场景,这是成本最低且有效的限制方式,比密钥更适合公开环境。

三、双重保障

把IP防火墙和代码里的Referer校验结合起来,就能同时满足你的两个需求:指定IP直接放行,其他请求只有来自foo.com的才允许访问。

内容的提问来源于stack exchange,提问作者user147529

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:04:50