如何为AWS CloudFront创建支持多文件扩展名的单一行为?
实现AWS CloudFront单一行为支持多种文件扩展名的方案
你遇到的问题很常见——CloudFront的行为路径模式确实不支持用|或,这种方式直接指定多个扩展名的OR条件。不过有几种可行的方法能实现你要的效果,我给你梳理一下:
方法一:用Lambda@Edge过滤请求(严格单一行为)
这是最贴合你需求的方案,通过Lambda@Edge函数在请求到达CloudFront时过滤出符合扩展名的请求,然后用一个行为统一处理。
具体步骤:
- 创建一个Lambda@Edge函数(选择Node.js运行时,部署到
us-east-1区域),逻辑是检查请求URI是否以.html或.php结尾。如果符合条件,就继续让请求走当前行为;不符合的话可以返回404或者路由到其他行为。 - 把这个函数绑定到CloudFront分发的Viewer Request触发器,对应的行为路径设为
/*(这样所有请求都会经过这个函数)。
示例代码参考:
exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; const uri = request.uri; // 匹配.html或.php结尾的路径,不区分大小写的话可加/i后缀 const validExts = /\.(html|php)$/; if (validExts.test(uri)) { // 符合条件,继续处理请求 callback(null, request); } else { // 不符合条件,返回404(你也可以改成重定向逻辑) const response = { status: '404', statusDescription: 'Not Found', headers: { 'content-type': [{ key: 'Content-Type', value: 'text/html' }] }, body: '<h1>404 Not Found</h1>' }; callback(null, response); } };
方法二:创建同配置的多行为(简单易维护)
如果你不需要严格意义上的“单一行为”,只是想让两种扩展名的请求用相同的规则处理,那可以直接创建两个行为:一个路径为*.html,另一个为*.php,然后把它们的源、缓存策略、转发设置等全部配置成一样的。
这种方法不用写代码,设置起来更快捷,而且CloudFront会自动按路径匹配优先级处理请求,效果上和单一行为没区别。
方法三:源端处理扩展名匹配(适合静态/Web服务器源)
如果你的源是S3桶或者EC2上的Web服务器(比如Apache/Nginx),也可以把扩展名匹配的逻辑放在源端:
- CloudFront只配置一个路径为
/*的行为; - 在源端设置重写规则(比如Apache的
mod_rewrite、Nginx的rewrite指令,或者S3的静态网站重定向规则),让源来识别并处理.html和.php文件的请求。
这种方式把逻辑下放给源,CloudFront只负责转发和缓存,适合已经有源端规则的场景。
内容的提问来源于stack exchange,提问作者Rick Battagline
相关产品推荐
相关产品推荐

