Nginx反向代理跨VM Laravel应用时资源加载失败(混合内容)问题求助
Nginx反向代理跨VM Laravel应用时资源加载失败(混合内容)问题求助
兄弟,我之前碰到过几乎一模一样的坑,给你理清楚问题根源和具体解决步骤:
首先你遇到的两个核心问题:
- 混合内容拦截:浏览器当前是HTTPS访问,但Laravel生成的资源URL是HTTP的,浏览器出于安全策略会拦截这类混合内容。
- 资源路径前缀缺失:你的反向代理是
/app3/前缀,但Laravel默认生成的资源是根路径(比如/css/style.css),浏览器请求的是主VM根目录下的资源,而不是转发到app3所在的VM。
下面是具体的解决办法:
一、调整Nginx反向代理配置,传递正确的请求头
把你配置里app3的location块改成这样(记得替换[app3的VMIP]为实际的VM地址,比如192.168.1.100):
location /app3/ { proxy_pass http://[app3的VMIP]/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 600s; # 关键:让Laravel知道当前是HTTPS访问,并且请求来自/app3前缀 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 告诉Laravel当前协议是HTTPS proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; # 兜底重写:如果还有资源用根路径,自动加上/app3前缀转发 rewrite ^/app3/(css|js|images|fonts)/(.*)$ /$1/$2 break; }
二、修改Laravel的配置,生成正确的资源URL
- 打开app3所在VM里的
.env文件,修改APP_URL和新增ASSET_URL:
APP_URL=https://mywebsite.com/app3 ASSET_URL=https://mywebsite.com/app3
- 让Laravel信任你的主VM代理,修改
app/Http/Middleware/TrustProxies.php:
protected $proxies = '*'; // 生产环境建议改成主VM的具体IP,比如['192.168.1.50'] protected $headers = \Illuminate\Http\Request::HEADER_X_FORWARDED_ALL;
这个配置是让Laravel认可反向代理传递过来的X-Forwarded-Proto等头信息,否则它会忽略这些,还是用HTTP生成资源URL。
三、清除Laravel缓存,让配置生效
修改完配置后,一定要在app3的VM里执行这些命令清除缓存:
php artisan config:cache php artisan route:cache php artisan view:clear
做完这些步骤后,刷新浏览器应该就能正常加载JS和CSS了。原理就是让Laravel知道自己是在HTTPS的/app3/路径下被访问的,生成的资源URL既用HTTPS,又带有正确的前缀,同时Nginx也能正确把资源请求转发到app3的VM上。
备注:内容来源于stack exchange,提问作者llesh
相关产品推荐
相关产品推荐

