laravel中url中未生成https解决方法

laravel 的 asset() 方法,默认并未去判断 http 或 https,默认是 http。

除非传递第二个参数为 true,会生成 https 链接

我们项目中,不可能因为一个 https,把所有连接全部改掉。本地的话,我们还得使用 http。

搜索了一些资料,更好的方案,应该如下:
.env:添加

IS_HTTPS = true;

在app/Providers/AppServiceProvider.php的boot中添加

	# 是否 HTTPS 环境
	# IS_HTTPS=true
    // HTTPS 访问
    if(env('IS_HTTPS')){
        URL::forceScheme('https');
    }

补充:
我们在上面的 AppServiceProvider 中采用 URL::forceScheme(‘https’),强制使用了 https 协议

我们在控制器、模板中,使用 url() 或 asset() 确实可以生成 https 的 url。

但今天发现项目中一个问题,支付宝支付的异步通知并未有日志记录,也就是说,支付宝的异步通知没有获取到。通过查看日志,发现发送给支付宝的异步通知的链接还是 http。

测试了半天,采用 url(‘test’) 在控制器、模板中测试输出,确实是 ‘https’,但是我们的异步通知链接确实是 ‘http’

最后排查,因为我们的支付宝异步链接写在了自定义的一个 HelperProvider 引入的常量定义文件const.php中:

define('ALIPAY_NOTIFY_URL', url('/payment/alipay/notify'));

看着没有任何问题啊!为什么生成的 url 不是 ‘https’?

突然想到了之前看过 laravel 源码,里面关于启动脚本,加载的各种启动文件的顺序,应该是 AppServiceProvider 的加载或执行顺序,在 HelperProvider 后面,导致:

    if(env('IS_HTTPS')){
        URL::forceScheme('https');
    }

代码还未执行!

/*
	启动脚本顺序:
        \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
        \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
        \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
        \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
        \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
        \Illuminate\Foundation\Bootstrap\BootProviders::class,
	    .env 等环境变量
	    config 配置
	    异常
	    Facade 注册
	    注册 Providers
	    启动 Providers
 */

综上分析:
我们得小心了,我们的 config/ 目录下的配置文件里,使用 url() 时,生成的也不是 ‘https’ 链接。

最终修改,强制改为 https 链接即可(添加参数true):

define('ALIPAY_NOTIFY_URL', url('/payment/alipay/notify', [], true));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yietion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值