Laravel5.5 Docker Nginx环境下Swagger静态资源缺端口导致页面空白求助
解决方案
问题根本原因
Laravel生成资源URL时未携带端口、协议匹配错误,由两处配置问题导致:
- Nginx传递给PHP的
HTTP_HOST参数仅包含主机地址,未携带用户访问时的端口,Laravel生成绝对URL时默认使用80/443端口,导致资源地址端口丢失 - 访问地址使用HTTPS协议,但Nginx硬编码传递
HTTPS off参数,Laravel识别为HTTP请求,生成的资源协议与访问协议不匹配,可能触发混合内容拦截
操作步骤
第一步:修改Nginx配置
编辑default.conf文件,找到location ~ \.php$配置块,修改两处参数:
location ~ \.php$ { try_files $uri =404; fastcgi_read_timeout 600; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 删掉原来硬编码的HTTPS off,替换为自动判断请求协议 fastcgi_param HTTPS $https if_not_empty; fastcgi_pass php-upstream; # 把原来的$host改成$http_host,自动携带访问端口 fastcgi_param HTTP_HOST $http_host; }
修改完成后重启Nginx容器生效:
docker-compose restart nginx
第二步:Laravel侧适配(如第一步未生效可执行)
方案A:调整配置文件
- 编辑项目根目录
.env文件,修正APP_URL为实际访问地址:
APP_URL=https://127.0.0.1:8080
- 发布Laravel-swagger配置文件(如未发布):
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
- 编辑
config/l5-swagger.php,将generate_absolute类配置设为false,使用相对路径加载资源,或者直接指定base_url为https://127.0.0.1:8080
方案B:强制全局URL规则
编辑app/Providers/AppServiceProvider.php,在boot方法中添加全局URL生成规则:
public function boot() { // 强制使用.env中配置的APP_URL作为根地址 $this->app['url']->forceRootUrl(config('app.url')); // 强制使用HTTPS协议 $this->app['url']->forceScheme('https'); }
修改完成后清除配置缓存:
php artisan config:cache
验证
重新访问https://127.0.0.1:8080/api/documentation,检查资源加载地址已携带8080端口、协议为HTTPS即可正常显示页面。
内容的提问来源于stack exchange,提问作者barsikko
相关产品推荐
相关产品推荐

