Laravel 5.5:Blade模板强制外部URL使用HTTPS问题求助
解决Laravel自动将HTTP转为HTTPS导致外部链接无法访问的问题
我之前处理用户提交的外部链接时也碰到过一模一样的问题,Laravel的HTTPS自动转换确实会给这类场景添不少麻烦。下面是几个亲测有效的解决思路:
1. 直接输出原始URL,别用Laravel的URL辅助函数
如果你之前是靠{{ url($user->website) }}或者{{ secure_url($user->website) }}生成链接,那肯定会被强制换成APP_URL的HTTPS协议。正确的做法是直接输出用户提供的完整原始URL:
<a href="{{ $user->website }}">{{ $user->website }}</a>
如果用户提交的URL没带协议(比如只有www.xyz.com),可以先判断协议再手动拼接,甚至可以在用户提交时让他们选择HTTP/HTTPS:
@php $website = $user->website; // 检查是否已有协议前缀,没有则默认添加HTTP(也可以让用户自主选择) if (!str_starts_with($website, ['http://', 'https://'])) { $website = 'http://' . $website; } @endphp <a href="{{ $website }}">{{ $website }}</a>
2. 检查模型访问器是否偷偷改了URL
很多时候我们会在模型里写访问器格式化字段,比如不小心加了这样的代码:
// User模型中可能存在的访问器(会移除HTTP协议) public function getWebsiteAttribute($value) { return str_replace('http://', '', $value); }
如果有这类代码,会直接把HTTP协议去掉,导致输出的URL缺前缀。去你的User模型里检查下,看看有没有处理website字段的访问器,有的话修改或者直接移除,保留用户提交的原始值就行。
3. 谨慎禁用全局HTTPS强制转换
如果你的全局配置里开了HTTPS强制,可能会影响外部链接的协议:
- 检查
.env文件里有没有FORCE_HTTPS=true,如果有可以先注释掉(但这会影响整个应用的HTTPS设置,只在万不得已时用)。 - 查看
App\Http\Middleware\TrustProxies中间件,确认它没有强制把所有请求转成HTTPS。如果应用本身需要HTTPS,这个方法优先级最低,优先用前面的方案。
4. 用未转义输出(注意XSS安全)
如果Blade的自动转义意外搞出了问题(一般不会移除协议,但以防万一),可以用{!! !!}输出未转义内容,但一定要确保用户提交的URL经过了安全验证,避免XSS攻击:
<a href="{!! $user->website !!}">{!! $user->website !!}</a>
小提示:用户提交URL时最好做验证,比如用Laravel的url规则,同时允许HTTP和HTTPS两种协议,过滤掉恶意链接。
内容的提问来源于stack exchange,提问作者Bandicood
相关产品推荐
相关产品推荐

