nginx中,当访问一个子目录时,代理访问其他端口内容,但不要携带子目录路径,因为代理接收方没有该子目录

在Nginx中,如果你想在访问一个子目录时代理到其他端口的内容,但不希望将子目录路径传递给后端服务,可以通过调整location块中的rewrite指令来实现。

假设你希望访问http://yourdomain.com/app时,(注意,访问时可能需要最后一个斜杠 http://yourdomain.com/app/)内容实际上来自于运行在本机3000端口上的服务,且不希望将/app这一子目录路径传递给后端,可以这样配置Nginx:

server {
    listen 80;
    server_name yourdomain.com;

    location /app {
        rewrite ^/app/(.*)$ /$1 break; # 重写请求路径,去掉/app前缀
        proxy_pass http://127.0.0.1:3000; # 代理到本机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;

        # WebSocket支持(如果需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 其他location配置...
}

在这个配置中,rewrite ^/app/(.*)$ /$1 break;这一行的作用是将请求URL中的/app部分剔除。正则表达式^/app/(.*)$匹配以/app/开头的任何路径,并捕获其后的所有字符(用(.*)表示)。然后,/$1将这部分路径(即捕获组1,不包含/app)放回,通过break终止重写规则执行。这样,当请求到达后端服务时,URL路径中就不包含原来的/app子目录了。

Was this helpful?

0 / 0

发表回复 0