Layui上传失败90%是因HTTPS页面发起HTTP请求被浏览器静默拦截,表现为Network中blocked:mixed-content;必须将upload.render的url设为绝对HTTPS地址,并确保反向代理透传X-Forwarded-Proto头、CORS响应头精确匹配源且支持credentials。

直接改掉 upload.render 里的 url 参数,确保它是绝对 HTTPS 地址——90% 的问题出在这儿,不是配置、不是证书、不是后端,就是前端发了个 HTTP 请求被浏览器静默拦了。
检查 Network 面板是否显示 blocked:mixed-content
打开 Chrome 或 Edge 开发者工具 → 切到 Network 标签页 → 点击上传按钮触发请求 → 找那个状态列标着 blocked:mixed-content 的条目。如果看到这个,说明浏览器根本没把请求发出去,error 回调都不会执行,控制台也不会报 JS 错误,只在 Network 里“消失”。
- 别只盯着 Console,它可能一片空白
- 别查服务器日志,请求压根没到后端
- 别怀疑 SSL 证书,问题在前端 URL 协议不匹配
upload.render 的 url 必须是绝对 HTTPS 地址
Layui 的 upload.render 不会自动补协议,url: "/upload" 或 url: "http://api.example.com/upload" 在 HTTPS 页面里都会触发混合内容。必须显式写成 https:// 开头的完整地址。
- ❌ 错误写法:
url: "/upload"(相对路径继承页面协议,但若服务端有 HTTP 重定向中间跳转,可能降级) - ❌ 错误写法:
url: "http://api.example.com/upload"(硬编码 HTTP) - ✅ 正确写法:
url: "https://api.example.com/upload"(显式 HTTPS,最可靠) - ⚠️ 谨慎用法:
url: "//api.example.com/upload"(协议相对 URL,依赖第三方服务支持 HTTPS)
后端反向代理要透传 X-Forwarded-Proto 头
如果你用 Nginx 做 HTTPS 终止,后端实际收到的是 HTTP 请求,但 Layui 前端生成的 URL 可能由后端模板拼接。如果后端没识别原始协议,就可能输出 http:// 链接。
- Nginx 配置里必须加:
proxy_set_header X-Forwarded-Proto $scheme; - 后端代码(如 PHP/Node.js)需检查
X-Forwarded-Proto是否为https,再决定拼接https://还是http:// - 否则即使前端写对了,动态渲染的
url仍可能是 HTTP
CORS 响应头要精确匹配源且带 credentials
上传成功后浏览器还要校验响应头。如果服务端返回的 Access-Control-Allow-Origin 是通配符 *,而前端又设了 withCredentials: true(Layui 默认开启),就会失败并表现为状态码 0。
- 服务端必须返回具体的源,例如:
Access-Control-Allow-Origin: https://yourdomain.com - 必须返回:
Access-Control-Allow-Credentials: true - 如果用了自定义 header(如
X-Token),还得加:Access-Control-Allow-Headers: X-Token
最容易被忽略的是:URL 看似正确,但实际由后端模板动态注入,而反向代理没传协议头,导致后端“以为”自己跑在 HTTP 上;或者 CORS 允许源写成了 * 却又开了凭据,这种组合会让上传卡在预检或响应阶段,现象和混合内容一样难排查。











