在DigitalOcean部署网站时JavaScript文件加载失败问题求助
问题分析与解决方案
核心问题
你的服务器仅在80端口运行HTTP服务,但页面中的静态资源请求被强制使用了HTTPS协议,而服务器未配置HTTPS(无SSL证书、未监听443端口),导致浏览器发起HTTPS请求时被拒绝连接。Postman用HTTP能正常获取文件也验证了这一点。
解决方案
方案1:修正静态资源引用路径(最快解决)
检查你的EJS模板文件,把硬编码的HTTPS资源链接改成相对路径或明确使用HTTP协议:
- 错误写法:
<script src="https://46.101.145.210/javascripts/cookieHandler.js"></script> - 正确写法(推荐相对根路径,自动适配当前页面协议):
<script src="/javascripts/cookieHandler.js"></script> - 或者明确指定HTTP协议:
<script src="http://46.101.145.210/javascripts/cookieHandler.js"></script>
方案2:为Express配置HTTPS服务(适合直接在Express层处理)
如果业务需要HTTPS访问,需先获取SSL证书(比如用Let's Encrypt免费证书),然后修改Express代码监听443端口:
const express = require("express"); const https = require("https"); const fs = require("fs"); const app = express(); // 读取SSL证书文件(替换为你的证书实际路径) const options = { key: fs.readFileSync("/path/to/private-key.pem"), cert: fs.readFileSync("/path/to/certificate.pem") }; app.use(express.static('public')); // 其他中间件、路由配置保持不变... // 启动HTTPS服务器,监听443端口 https.createServer(options, app).listen(443, () => { console.log("HTTPS server running on port 443"); }); // 可选:将80端口的HTTP请求重定向到HTTPS app.listen(80, () => { app.use((req, res) => { res.redirect(`https://${req.headers.host}${req.url}`); }); });
方案3:用Nginx做反向代理(生产环境推荐)
生产环境更建议用Nginx处理HTTPS,把请求转发到内部的Express服务:
- 安装Nginx并配置好SSL证书
- 修改Nginx配置文件(示例路径:
/etc/nginx/sites-available/your-app):
server { listen 80; server_name 46.101.145.210; # 将HTTP请求重定向到HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name 46.101.145.210; ssl_certificate /path/to/certificate.pem; ssl_certificate_key /path/to/private-key.pem; location / { # 转发请求到Express的80端口(或你指定的内部端口) proxy_pass http://localhost:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 重启Nginx服务:
sudo systemctl restart nginx
额外排查点
- 确认EJS模板中没有全局强制HTTPS的配置(比如
<base>标签设置了https://前缀) - 检查浏览器缓存,清空旧的HTTPS资源引用后重新访问
内容的提问来源于stack exchange,提问作者abstract_func
相关产品推荐
相关产品推荐

