Nodejs nginx如何将http://localhost/api/getuser rewrite为http://localhost/product/api/getuser

Nodejs nginx如何将http://localhost/api/getuser rewrite为http://localhost/product/api/getuser

如题,也就是api前面如果没有product,则加上

5 回复

如何使用Nginx将 http://localhost/api/getuser 重写为 http://localhost/product/api/getuser

背景

在某些情况下,你可能希望在不改变客户端请求的情况下,在服务器端对URL进行重写。例如,你可能希望将所有对 /api/ 的请求重写为 /product/api/。这可以通过Nginx的重写功能实现。

解决方案

Nginx 提供了强大的重写规则(rewrite rules),可以用来修改客户端的请求。我们可以利用 rewrite 指令来实现这一需求。

示例配置文件

假设你的Nginx配置文件位于 /etc/nginx/nginx.conf 或者某个站点特定的配置文件中,比如 /etc/nginx/sites-available/default。你需要编辑或添加以下配置:

server {
    listen 80;
    server_name localhost;

    location /api/ {
        # 将所有以 /api/ 开头的请求重写为 /product/api/
        rewrite ^/api/(.*)$ /product/api/$1 break;
        
        # 反向代理到Node.js应用
        proxy_pass http://localhost:3000/;
    }
}

代码解释

  1. listen 和 server_name:

    • listen 80; 指定了Nginx监听的端口。
    • server_name localhost; 指定了服务器名称,这里为本地主机。
  2. location /api/:

    • 这部分定义了当请求路径匹配 /api/ 时的行为。
  3. rewrite 规则:

    • rewrite ^/api/(.*)$ /product/api/$1 break; 是核心部分。
      • ^/api/(.*)$ 是正则表达式,匹配所有以 /api/ 开头的请求。
      • (.*) 匹配 /api/ 后面的所有内容,并将其捕获为 $1
      • /product/api/$1 是替换后的路径,保留了原始请求中的其余部分。
      • break 表示一旦重写完成,不再继续处理其他重写规则。
  4. proxy_pass:

    • proxy_pass http://localhost:3000/; 将请求转发到本地运行的Node.js应用,默认端口为3000。

总结

通过上述配置,所有对 http://localhost/api/ 的请求都会被重写为 http://localhost/product/api/,并且转发给后端的Node.js应用处理。这样,你可以灵活地调整前端的URL结构,而不需要修改后端代码。


301/302重定向;

方法一: <pre><code> rewrite /product/(.) /$1; rewrite /(.) /product/$1; </code></pre>

方法二: <pre><code> if ($uri ~ ^/product) { rewrite /(.*) /product/$1; } </code></pre>

谢谢呀~

要将 http://localhost/api/getuser 重写为 http://localhost/product/api/getuser,可以使用 Nginx 的 rewrite 指令。以下是如何配置 Nginx 来实现这一需求的示例。

Nginx 配置示例

在你的 Nginx 配置文件中(通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/default),找到或添加一个 server 块,并添加以下配置:

server {
    listen 80;
    server_name localhost;

    location /api/ {
        # 检查是否已经包含 product
        if ($request_uri !~* "^/product/") {
            rewrite ^/api/(.*)$ /product/api/$1 last;
        }

        # 将请求转发到后端的 Node.js 应用
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解释

  1. location /api/ { ... }: 定义一个匹配以 /api/ 开头的请求的 location 块。
  2. if ($request_uri !~* "^/product/") { ... }: 使用正则表达式检查请求 URI 是否不包含 /product/
  3. rewrite ^/api/(.*)$ /product/api/$1 last;: 如果 URI 不包含 /product/,则将其重写为 /product/api/ 后面跟着原始 URI 的其余部分。$1 表示捕获组中的第一个参数。
  4. proxy_pass http://localhost:3000;: 将重写的请求传递给运行在本地端口 3000 上的 Node.js 应用。

重启 Nginx

保存配置文件后,需要重启 Nginx 服务使更改生效:

sudo systemctl restart nginx

或者如果你使用的是不同的初始化系统,可能需要使用其他命令来重启 Nginx。

这样配置后,访问 http://localhost/api/getuser 将会被 Nginx 重写为 http://localhost/product/api/getuser,并继续转发到你的 Node.js 应用进行处理。

回到顶部