【问题标题】:Laravel Blade adding domain in front of external URLsLaravel Blade 在外部 URL 前添加域
【发布时间】:2019-08-08 15:44:03
【问题描述】:

在我的网站上,用户可以共享 URL。

这些在我的数据库中存储为text 类型。

这些链接显示如下:

<a href="{{ $submission->link }}" rel="nofollow">{{$submission->title}}</a>

这样做的问题是,如果检测到 href,blade 会在 URL 前添加域。

所以如果链接是www.google.com它看起来像http://localhost/www.google.com

但是,如果链接是 https://www.google.com,它会正常工作。

我在搜索这个问题时看到的一个解决方案是将//放在href的开头,如下所示:

<a href="//{{ $submission->link }}" rel="nofollow">{{$submission->title}}</a>

这适用于以www. 开头的链接,但如果我使用https://www.google.com,URL 将如下所示:

https//www.google.com

注意缺少:

这个问题最优雅的解决方案是什么?在存储到数据库之前我是否删除了 https?我是否这样做,如果有 https,我照常打印链接,但如果没有 https,我添加 //

【问题讨论】:

标签: php laravel


【解决方案1】:

www.google.com 不是 URL,它是其中的一部分。 URL must include a schemehttp。如果没有,它们将被视为相对链接。

当您的用户提交 URL 时,使用 the url validation rule 来验证格式。或者,您可以检测开头没有 httphttps 的 URL,然后自动添加或提醒用户修复它。

【讨论】:

  • 我使用 'link' => 'max:3000|regex:/^(https?:\/\/)?([\da-z\.-]+)\.([ a-z\.]{2,6})([\/\w \.-]*)*\/?$/',在我的验证器中。我希望这样用户不需要添加 http 或 https,如果他们不需要的话。我的问题是,即使链接只有 http 而不是 https,我可以将 https 添加到他们的链接吗?
  • @FelixMaxime 不是真的 - 不是每个人都有https。在大多数情况下,http 将重定向到 https(如果站点支持),并且使用 http 将匹配浏览器在其中输入 www.google.com 时会执行的操作。
  • 好的。在这种情况下,如果没有提供 http/https,我将使用 http 保存到数据库的链接。感谢您的回复。
【解决方案2】:

Blade 不会更改您的数据。它必须是您页面上的某种 JS,否则数据库中的链接格式不正确。解决方案是,如果缺少协议,您应该自己添加。

在您的刀片文件中,执行以下操作:

<a href="{{ strpos($submission->link, 'http') === false ? 'http://' . $submission->link : $submission->link }}" rel="nofollow">{{$submission->title}}</a>

但我建议您应该在模型或控制器中处理此问题。应在您的模型中使用 getter 和 setter 来验证和构建正确的链接,以确保不会发生不一致。

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 2019-01-20
    • 2016-10-20
    • 2022-11-15
    • 2014-12-11
    • 2015-03-28
    • 1970-01-01
    • 2015-12-24
    • 2016-07-23
    相关资源
    最近更新 更多