Nginx 仅反向代理特定子目录并传递其他所有内容

Nginx 仅反向代理特定子目录并传递其他所有内容

我有一个开发情况,其中我有一个包含多个服务的域:

https://somewebpage.com

此服务上有多个项目作为子目录

  • https://somewebpage.com<- 登陆页面
  • https://somewebpage.com/api<- rest api 服务器
  • https://somewebpage.com/app<- 我的应用程序

那么,是否有可能(以及如何)设置 nginx 和 hosts 文件以仅对https://somewebpage.com/app我的本地构建进行反向代理http://localhost:3000

/api问题是,当应用程序部署时,访问其他服务器没有问题,但是在本地提供服务时,我的 nginx 反向代理也会拦截landing pagerest api serverURL。

我的 nginx 配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }
    }
}

在我的/etc/hosts我有:

127.0.0.1    somewebpage.com

还有其他技巧可以达到类似的效果吗?

我尝试这样做的原因是,如果我从我的电脑上执行此操作,localhost:3000它将响应CORS错误并拒绝我的呼叫/api

或者这是否存在太大的安全隐患,我必须寻求其他的访问方式/api

提前感谢您的回答。

答案1

您需要添加以下内容:

location / {
    try_files $uri $uri/ =404;
}

这告诉 nginx 如何处理与其他指定不匹配的请求location。有关 nginx 如何选择location要使用的块的更多信息,请阅读nginx 文档

答案2

我想到了一个对我有用的解决方案。

somewebpage.com指向xx.xx.xx.xx静态 IP 地址,所以我只需添加另一个代理转发到该 IP 地址,而不是类似于 Tero Kilkanen 答案的 URL。

  location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass https://xx.xx.xx.xx;
  }

这样,/etc/hosts文件就不会拦截我的somewebpage.com请求,因为请求将绕过域解析。

因此,最终我得到了以下对我有用的 nginx 配置:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }

        location / {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass https://xx.xx.xx.xx;
        }
    }
}

由于幕后有多个 IP 地址或动态 IP 地址或其他原因,此解决方案可能不适用于所有人。但它对我来说是有效的,并且对于开发目的来说已经足够好了。

相关内容