Laravel 9手枪赛事系统邮件链接格式错误原因排查
你的问题出在Laravel版本升级后,url()函数的参数处理逻辑变化,以及$notification->link的内容可能不符合Laravel 9的url()函数预期。
核心原因
在Laravel 5.3中,url()函数如果传入的是完整URL(带域名),会直接返回该URL;但Laravel 9的url()函数会将传入的字符串视为路径片段,即使它包含完整域名,也会拼接到当前配置的APP_URL之后,导致生成错误的嵌套链接(比如你看到的http://shoot.mywire.org/${http://shoot.mywire.org}/app/competitions/39)。
另外,也有可能是新系统中$notification->link的赋值逻辑出错:原本旧系统里它存储的是相对路径(比如/app/competitions/39),但新系统中错误地存储成了完整URL,再经过url()二次拼接就出问题了。
解决方法
直接输出完整链接(如果
$notification->link已经是正确的完整URL)
把模板里的代码改成:{{ $notification->link }}不需要用
url()包裹,直接输出即可。用相对路径配合
url()(如果$notification->link是相对路径)
确认$notification->link的值是相对路径(比如/app/competitions/39),同时检查.env文件中的APP_URL是否设置为http://shoot.mywire.org,此时url($notification->link)会正确生成完整链接。推荐使用路由生成链接(更可靠)
如果你为赛事页面定义了命名路由(比如competition.show),直接用route()函数生成链接,避免硬编码路径的问题:{{ route('competition.show', $notification->competition_id) }}这种方式会自动根据路由配置生成正确的URL,不受Laravel版本升级的路径拼接逻辑影响。
内容的提问来源于stack exchange,提问作者raffodog

