Nginx转发目录请求至Express失败,含动态参数路径如何配置?
问题分析与解决方案
核心问题1:Nginx配置中的try_files指令阻塞请求转发
你所有location块里的try_files $uri $uri/ =404;是导致404的直接原因——这个指令会优先尝试在Nginx本地的/var/www/html目录下查找对应文件,找不到就直接返回404,完全不会执行proxy_pass转发请求到Express服务。
核心问题2:Express路由参数错误
在/prepop/:lookup_key路由中,你用了req.params.send_key,但路由定义的参数名是lookup_key,参数不匹配会导致SQL查询失败;同时直接拼接SQL语句存在严重的注入风险。
修改后的Nginx配置
删除所有location里的try_files指令,确保请求能正常转发:
server { root /var/www/html; location / { proxy_pass http://localhost:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location /pretest { proxy_pass http://localhost:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location /prepop { proxy_pass http://localhost:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/subdomain.mydomain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/subdomain.mydomain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = subdomain.mydomain.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80 ; listen [::]:80 ; server_name subdomain.mydomain.com; return 404; # managed by Certbot }
修改后的Express代码
修正路由参数名,同时使用参数化查询避免SQL注入:
const path = require('path'); const express = require("express"); const mysql = require('mysql2'); const cors = require("cors") const port = process.env.PORT || 8080; const app = express(); app.use(cors()) app.get('/', (req, res) => { res.send('hello'); }); app.get('/pretest', (req, res) => { res.send('test'); }); app.get('/prepop/:lookup_key', (req, res) => { let connection = mysql.createConnection({ // 此处填写你的数据库连接配置 }); connection.connect(); // 参数化查询避免SQL注入,修正路由参数名 connection.query('SELECT * FROM table_incoming_leads WHERE leadid = ?', [req.params.lookup_key], (err, response, fields) => { if (err) { console.log(err); return res.status(500).json({error: '数据库查询失败'}); } if (response.length === 0) { return res.status(404).json({error: '未找到对应记录'}); } res.json({ email: response[0].email, first_name: response[0].first_name, last_name: response[0].last_name }) }); connection.end(); }) app.listen(port, () => console.log(`Server listening on port ${port}`));
生效步骤
- 修改Nginx配置后,执行
sudo nginx -t检查语法,无误后执行sudo systemctl reload nginx重启Nginx。 - 重启你的Node.js服务,让代码修改生效。
内容的提问来源于stack exchange,提问作者Xenno
相关产品推荐
相关产品推荐

