S3存储桶IP限制策略403异常:终端curl正常PHP调用报错
问题分析与解决办法
核心原因
你遇到的问题本质是两种访问场景的源IP不一致:
- 终端curl请求用的是你本地设备的公网IP(也就是你确认的
68.6N.NN1.1N2),符合策略要求所以返回200; - 通过index.php访问时分两种情况:
- 若你在浏览器里打开index.php后直接加载S3图片链接,S3识别到的是你浏览器的出口公网IP(如果本地设备和浏览器同属一个网络,IP应该一致;但如果index.php部署在服务器上,你用浏览器访问时,S3看到的是你本地浏览器的IP,而非服务器IP);
- 若你在PHP代码里用后端请求(比如
file_get_contents、curl)拉取S3文件,S3识别到的是你的服务器公网IP,和策略里填的本地IP不符,所以返回403。
解决步骤
确认实际访问的源IP
- 场景1(浏览器直接加载):打开浏览器,查看自身公网IP(可通过能显示公网IP的页面获取),记下该IP;
- 场景2(PHP后端请求):登录服务器,在终端执行
curl ifconfig.me(或类似命令),获取服务器的公网IP。
修正存储桶策略
将策略里的aws:SourceIp值替换为上面获取到的真实IP,单个IP可直接填写,或加上/32掩码(更规范),示例如下:{ "Version": "2012-10-17", "Id": "Policy17NN310NN0610", "Statement": [ { "Sid": "Stmt171NN106NN335", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::testbucket/file.jpg", "Condition": { "IpAddress": { "aws:SourceIp": "真实IP/32" } } } ] }验证
保存策略后,重新测试index.php里的访问方式,即可正常返回200。
额外补充
如果需要同时允许本地终端和浏览器/服务器访问,可在策略里用数组形式添加多个IP,示例:
"aws:SourceIp": ["68.6N.NN1.1N2/32", "服务器IP/32"]
内容的提问来源于stack exchange,提问作者oldboy
相关产品推荐
相关产品推荐

