在config/app.php里面有这样一个设置项:

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => 'http://localhost',
    
    

由上面的注释可知,当我们以cli模式调用php时,就会使用这个url来生成正确的网址。

遇坑过程

当我尝试使用redis作为mail发送队列的时候,需要将发送的邮件放到redis里面后,然后执行php artisan queue:listen将邮件读取出来并发送。
由于发送的邮件模板里面使用url()函数,因此理论上会读取到config/app.php里面url的设定值。
提前说明一下,为了部署的灵活性,我预先在env文件里面设置了APP_URL,然后在app.php里面调用它。

好,重点的地方到了!
在本地开发时,无论我尝试多少遍,邮件里面url('/')取到的值永远都是localhost!!
但是!将代码部署到远程以后(当然env里面APP_URL设置值已更改为部署服务器的网址),居然邮件里面显示是正常的!!!

经过多次测试,和使用php artisan tinker进行了反复确认,确实在本地无论配置怎么改,url('/')永远都是localhost;而服务器永远都是www.zshanjun.com。

问题是,为什么本地表现出这样的行为?

填坑过程

问题出现在本地,那么我就从本地找原因。
通常我们在本地开发时,一般都习惯将网站的域名设置为例如zshanjun.dev

问题就出现在这个地方!

当我在本地开发时,会直接将APP_URL设置为zshanjun.dev,在线上的时候,会将APP_URL设置为http://www.zshanjun.com

这时候,如果细心一点,应该就能发现它们两者的区别了!

解决方案就是,给zshanjun.dev也加上http://

到此问题解决!


参考网站:


Laravel

登陆发表评论