Month: 1 月 2022

laravel 处理 http_build_query() 参数中的 PHP_QUERY_RFC3986(URL编码协议)

2022年1月10日 laravel, PHP

原生 http_build_query() 方法定义:

function http_build_query (object|array $data, string $numeric_prefix = "", ?string $arg_separator = "&", int $encoding_type = PHP_QUERY_RFC1738)

指定使用 PHP_QUERY_RFC3986:

$query = http_build_query($query_data, null, null, PHP_QUERY_RFC3986);

laravel:

GuzzleHttp\Psr7\Query::build() 默认使用 PHP_QUERY_RFC3986

方法定义:

public static function build(array $params, $encoding = PHP_QUERY_RFC3986)

laravel6.x 使用 config:cache 导致 env() 函数不能直接读取.env 文件

2022年1月8日 laravel

线上环境一但使用 php artisan config:cache 就会各种异常,最终检查原因是使用 config:cache 后env() 是无法读取 .env文件配置的。

 

将 config 文件之外的所有 env() 方法使用 config() 代替

如:

在 config/app.php 中添加:'force_https' => env('FORCE_HTTPS', false),

调用时使用 config('app.force_https')

 

PS: 通过composer引用的包不受此影响

关于laravel6 的https踩坑记录

2022年1月6日 laravel

开发环境是http的,线上环境https,导致线上资源加载http而无法加载。

大多网友遇到问题是通过给asset()加第二个参数,或使用secure_asset()代替

两个方法都要修改所有引用的blade,还有一些第三方blade重写更加麻烦,如horizon的单页面

废话少说,解决方案:

 

1、.env 添加ASSET_URL=xxx 与APP_URL一致,用于给asset()添加固定的https前缀

2、.env 添加 FORCE_HTTPS=true,本地环境false

3、config/app.php 添加'force_https' => env('FORCE_HTTPS', false)

4、AppServiceProvider boot() 里添加如下代码,用于解决url()生成https链接

        if( config('app.force_https') ){
            \Url::forceScheme('https');
        }

5、AppServiceProvider register() 里添加如下代码,用于解决pjax加载https

        if( config('app.force_https') ) {
            $this->app['request']->server->set('HTTPS', true);
        }

6、测试,OK