Laravel 8 对接DigitalOcean Spaces上传时域名异常拼接问题如何解决
问题根因
你使用的league/flysystem-aws-s3-v3 ^1.0版本配合Laravel 8的S3驱动时,默认按照AWS官方S3的域名规则拼接请求地址,未启用第三方S3兼容存储的endpoint处理逻辑,所以即便你配置了DigitalOcean的endpoint,系统还是会默认拼接bucket名.s3.区域.amazonaws.com格式的AWS官方域名。
解决方案
步骤1:补全filesystems配置项
修改config/filesystems.php中的spaces驱动配置,新增2个必要参数:
'spaces' => [ 'driver' => 's3', 'key' => env('SPACES_ACCESS_KEY_ID', '===AAACESS KEY==='), 'secret' => env('SPACES_SECRET_ACCESS_KEY', '===BBBSECRECT KEY==='), 'region' => env('SPACES_DEFAULT_REGION', 'sgp1'), 'bucket' => env('SPACES_BUCKET', 'laravel-spaces'), 'url' => env('SPACES_URL', 'https://laravel-spaces.sgp1.cdn.digitaloceanspaces.com'), 'endpoint' => env('SPACES_ENDPOINT', 'https://sgp1.digitaloceanspaces.com'), // 新增以下两行配置 'use_path_style_endpoint' => true, 'bucket_endpoint' => false, ],
参数说明:
use_path_style_endpoint设为true:禁止S3客户端将bucket名拼接到域名前缀,改为将bucket名放到请求路径中bucket_endpoint设为false:明确告知S3客户端当前配置的endpoint不是直接绑定bucket的专属域名
步骤2:清除Laravel配置缓存
执行以下命令清除旧的配置缓存,确保新配置生效:php artisan config:clear
步骤3:验证修复效果
重新在Tinker中执行上传测试代码,此时请求地址会正确指向DigitalOcean Spaces的服务地址,不会再拼接AWS的域名后缀。
如果配置后仍报错,可尝试将league/flysystem-aws-s3-v3更新到1.x分支的最新版本,低版本存在自定义endpoint兼容问题:composer update league/flysystem-aws-s3-v3
内容的提问来源于stack exchange,提问作者Peter Jack
相关产品推荐
相关产品推荐

