Symfony5项目LiipImagine生成图片URL含S3桶名无法访问问题
问题根因
liip_imagine的AWS S3缓存解析器默认生成URL时,会将存储桶名称作为URL路径的第一级拼接,当你使用CloudFront作为CDN时,CloudFront的源站配置已经直接指向对应S3桶的根目录,路径中不需要额外携带桶名,所以会出现路径多了桶名的问题。同时你配置中还存在桶名不一致的错误,也会加剧访问异常。
解决方案
第一步:修正liip_imagine.yaml配置
修改cache_resolver_aws_s3部分的配置,增加移除桶名的参数,同时统一桶名、代理地址配置:
resolvers: cache_resolver_aws_s3: aws_s3: client_config: credentials: key: '%env(AWS_KEY)%' secret: '%env(AWS_SECRET_KEY)%' region: 'eu-west-3' version: 'latest' bucket: 'nameBucket' # 修正之前错误的myBucket配置,和其他配置的桶名统一 get_options: Scheme: 'https' put_options: CacheControl: 'max-age=86400' proxies: ['https://nameProxy'] # 修正之前错误的myProxy配置,和实际代理地址统一 cache_prefix: '' # 新增:设置缓存前缀为空,避免额外路径拼接 strip_bucket_name: true # 新增:直接移除URL路径中的存储桶名称
第二步:清理缓存生效配置
执行Symfony缓存清理命令:php bin/console cache:clear
可选优化项
你当前配置中自定义的app.imagine.cache.resolver.amazon_s3服务没有被任何过滤器集使用,所有filter_sets都绑定了默认的cache_resolver_aws_s3,如果不需要自定义解析逻辑可以直接删除该服务配置避免混淆。
如果使用的liip_imagine版本较低不支持strip_bucket_name参数,可以切换使用你自定义的解析器,给服务增加代理配置即可:
app.imagine.cache.resolver.amazon_s3: class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver arguments: - "@aws.s3.client" - "nameBucket" calls: - [ setGetOption, [ Scheme, https ] ] - [ setPutOption, [ CacheControl, "max-age=86400" ] ] - [ setProxy, ['https://nameProxy', ''] ] # 新增代理配置,第二个参数为空表示不拼接桶名 tags: - { name: "liip_imagine.cache.resolver", resolver: "amazon_s3" }
再把所有filter_sets下的cache: cache_resolver_aws_s3改成cache: amazon_s3,清理缓存即可生效。
内容的提问来源于stack exchange,提问作者clement Lehuede
相关产品推荐
相关产品推荐

