You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}`));

生效步骤

  1. 修改Nginx配置后,执行sudo nginx -t检查语法,无误后执行sudo systemctl reload nginx重启Nginx。
  2. 重启你的Node.js服务,让代码修改生效。

内容的提问来源于stack exchange,提问作者Xenno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:55:44