同一子域名同时对接CloudFront、S3与Apache的可行性及/admin/login路由配置方案咨询
同一子域名同时对接CloudFront、S3与Apache的可行性及/admin/login路由配置方案咨询
没问题,完全可以在同一个子域名dev.demo.thiha.com下同时跑CloudFront+S3的静态前端和Apache上的Laravel后端,这也是这类场景的标准最佳实践,下面给你一步步拆解怎么实现:
一、核心可行性说明
核心思路是把CloudFront作为统一的流量入口,通过它的「行为(Behaviors)」规则根据请求路径自动分流:
- 所有非
/admin/*和/api/*的请求(比如Flutter前端的静态资源、根路径页面),转发到S3桶处理; - 所有
/admin/*和/api/*的请求,转发到运行Apache的Laravel服务器处理。
用户访问时完全感知不到背后的服务差异,整个域名体验是统一的。
二、具体配置步骤(按顺序操作,避免踩坑)
1. 先确保Apache+Laravel服务能被CloudFront正常访问
- 如果你的Apache跑在EC2上,先在EC2的安全组里开放80和443端口,只允许CloudFront的官方IP段访问(AWS控制台能查到CloudFront的IP范围列表,或者直接用AWS的
cloudfront前缀列表配置,更省心)。 - 配置Apache的虚拟主机,确保
dev.demo.thiha.com能正确指向Laravel的public目录,并且开启URL重写(Laravel路由必须的),示例配置代码:<VirtualHost *:443> ServerName dev.demo.thiha.com DocumentRoot /var/www/your-laravel-project/public SSLEngine on SSLCertificateFile /path/to/your/cert.pem SSLCertificateKeyFile /path/to/your/privkey.pem <Directory /var/www/your-laravel-project/public> AllowOverride All Require all granted RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L] </Directory> ErrorLog ${APACHE_LOG_DIR}/dev-demo-thiha-error.log CustomLog ${APACHE_LOG_DIR}/dev-demo-thiha-access.log combined </VirtualHost> - 提前测试:直接访问Apache的公网IP(绑定域名后),确保
/admin/login和/api接口能正常返回内容,这一步是基础,先把后端的连通性搞定再碰CloudFront。
2. 配置CloudFront的分流规则
登录AWS控制台找到你的CloudFront分发,进入「Behaviors」标签页,按以下规则调整:
- 默认行为(Default *):保留这个行为,源设置为你的S3桶(确保S3静态网站配置、OAI权限都没问题),缓存策略选
CachingOptimized,用来处理所有前端静态请求(根路径、js/css、图片等)。 - 添加
/admin/*路径的行为:- Path Pattern填
/admin/* - 源选择你的Apache服务器地址(比如EC2的Elastic IP,或者给EC2绑的私有域名)
- Viewer Protocol Policy设为
Redirect HTTP to HTTPS(强制HTTPS) - 缓存策略选
CachingDisabled(admin后台是动态内容,绝对不能缓存) - Origin Request Policy选
AllViewerExceptHostHeader(确保Cookie、Authorization这类请求头能正确传给Laravel)
- Path Pattern填
- 添加
/api/*路径的行为:- 配置和
/admin/*几乎完全一致,Path Pattern填/api/*,同样指向Apache源、禁用缓存,保证接口的实时性。
- 配置和
- 关键注意点:CloudFront是从上到下匹配路径的,一定要把
/admin/*和/api/*的行为拖到默认行为的上方,这样特定路径的请求会先被匹配到,不会错误走到S3。
3. 补全CloudFront的全局SSL配置
你已经用ACM申请了dev.demo.thiha.com的证书,确保CloudFront分发的「Custom SSL Certificate」已选中该证书,并且全局Viewer Protocol Policy设为Redirect HTTP to HTTPS,整个站点强制HTTPS访问。
三、额外的最佳实践小建议
- 安全加固:如果担心Apache服务器的公网暴露风险,可以把EC2放到VPC的私有子网里,前面加一个Network Load Balancer(NLB),CloudFront直接指向NLB端点,这样Apache完全在私有网络内,更安全。
- 静态资源缓存优化:Flutter编译后的带哈希值的静态文件(比如
main.xxxx.dart.js)可以设30天的长缓存,利用哈希值避免缓存旧版本;而index.html要设短缓存(比如5分钟)或者直接禁用缓存,确保前端更新后用户能拿到最新页面。
备注:内容来源于stack exchange,提问作者502_Geek
相关产品推荐
相关产品推荐

