经VPC搭建SSH隧道访问私有AWS S3网站出现301重定向错误咨询
问题根因
返回301重定向的核心原因是S3静态网站端点依赖HTTP请求的Host头识别目标存储桶。你当前使用的SSH本地端口转发是四层转发,不会修改请求携带的Host字段:本地访问localhost:3000时,请求头里的Host值为localhost:3000,S3端点收到请求后匹配不到对应Host的存储桶,就会返回WebsiteRedirect编码的301响应,最终跳转到S3官方首页。
你在VPC内EC2上直接执行curl能正常拉取内容,是因为curl默认会把访问目标域名{bucketname}.s3-website-{region}.amazonaws.com填入Host头,S3可以正常识别桶信息。
临时调试修复方案
如果只是短期测试,不需要调整现有架构,可直接用以下两种方法解决:
- 手动指定Host头
命令行测试时直接给curl加Host头参数即可:
要用浏览器访问的话,安装请求头修改类插件,给curl -H "Host: {bucketname}.s3-website-{region}.amazonaws.com" http://localhost:3000localhost:3000域下的所有请求添加固定Host头,值为你的S3静态网站域名即可正常加载。 - 改用SSH动态代理
四层本地端口转发改不了应用层内容,换成SOCKS5动态隧道配合Hosts映射可以完全模拟VPC内的访问环境:- 建立动态SOCKS代理,不指定固定转发目标:
ssh -N -D 1080 -i {keypair}.pem ec2-user@{ec2-instance-in-vpc} - 修改本地hosts文件,添加一条记录把
{bucketname}.s3-website-{region}.amazonaws.com指向127.0.0.1 - 给浏览器配置SOCKS5代理,地址为
127.0.0.1:1080,开启「代理解析DNS」选项 - 直接在浏览器访问
http://{bucketname}.s3-website-{region}.amazonaws.com即可,请求全程走VPC内EC2代理,Host头、请求路径都和EC2本地访问完全一致,不会触发重定向。
- 建立动态SOCKS代理,不指定固定转发目标:
长期访问/标准化测试方案
SSH隧道仅适合临时调试,生产级连通或者常态化测试建议用以下方案,稳定性更高:
- VPC内部署反向代理
在S3网关端点关联的子网内部署轻量Nginx实例,配置反向代理规则,主动改写请求Host头为S3网站域名:
后续不管是做SSH端口转发到Nginx端口、给Nginx挂载内网负载均衡,还是对接VPN接入,都可以直接访问,不需要额外修改本地请求配置。server { listen 80; location / { proxy_pass http://{bucketname}.s3-website-{region}.amazonaws.com; proxy_set_header Host {bucketname}.s3-website-{region}.amazonaws.com; } } - 替换S3静态网站托管模式
S3公网网站端点天生依赖Host头做桶路由,私有化场景下建议改用S3接口端点,前置挂载ALB或者API网关,统一做路径和Host头改写,对内网/授权访问用户提供服务,避免公网端点的路由逻辑限制。 - 轻量验证直接在EC2内操作
如果只是验证页面可访问性、对象权限配置是否正确,直接在EC2上安装w3m、lynx这类命令行浏览器访问S3端点即可,不需要搭建本地隧道,验证效率更高。
内容的提问来源于stack exchange,提问作者bunyhel
相关产品推荐
相关产品推荐

