端口转发后的Express API遇CORS拦截:缺失Access-Control-Allow-Origin头
问题解决步骤
1. 修复Nginx转发逻辑问题
你的Nginx配置中,try_files $uri $uri/ =404会优先在本地/var/www/html目录查找对应文件,只有当文件不存在时才会转发请求到Express。但/test这类API路由不存在本地文件,会被Nginx直接返回404,根本没传到Express服务,自然不会带上CORS响应头。
修改Nginx的location /配置,移除try_files规则(或调整顺序让代理优先):
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; server_name _; location / { proxy_pass http://localhost:5000; # 若需保留本地静态文件访问,可替换为以下配置 # try_files $uri $uri/ @proxy; } # 仅当需要同时访问本地静态文件时添加此块 # location @proxy { # proxy_pass http://localhost:5000; # } }
2. 验证配置生效
修改后重启Nginx服务:
sudo systemctl restart nginx
用curl测试/test路由,检查响应头是否包含CORS相关字段:
curl -I http://converttopdf.ddns.net/test
如果输出中存在Access-Control-Allow-Origin: *,说明配置已生效。
3. 额外校验项
- 确保Express的CORS中间件挂载在所有路由定义之前,否则路由不会应用CORS规则:
const cors = require("cors"); const corsOptions = { origin: "*", credentials:true, optionSuccessStatus:200, } app.use(cors(corsOptions)); // 这行必须在路由定义前执行 // 后续定义API路由 app.get('/test', (req, res) => { res.send('测试响应'); }); - 检查树莓派防火墙是否开放80端口,确保外部请求能正常到达Nginx。
内容的提问来源于stack exchange,提问作者thething23
相关产品推荐
相关产品推荐

