问题:如何使用 NGINX 作为反向代理路由第一个 URI 段?

我正在尝试在 Amazon Web Services 上构建架构/基础设施。今天我有一个像网关一样工作的 EC2,后台有 NGINX。顺便说一句,我是 NGINX 的新手。

上周我有这个 NGINX 配置文件:

server {
    listen 80;

    # I put * for hide the real domain name
    server_name ******.com.ar www.******.com.ar;

    location / {
         proxy_set_header   X-Forwarded-For $remote_addr;
         proxy_set_header   Host $http_host;
         proxy_pass         "http://private.ip.1:80/";
    }
}

而且效果很好!当我访问 www.domain.com.ar 时,我会重定向到端口 80 上的私有 ip 1。

但是,现在,我需要稍微调整一下配置文件。

  1. 首先,我需要将一些已知路径重定向到私有 ip 1(例如 /company、/portfolio、/services、/contact 和子序列:/company/ourvision、/services/software、/contact/workwithus)。我使用的是 NodeJS,而不是 PHP。

2)如果之前的路径都没有匹配,我需要将第一个 URI 段作为通配符(例如http://domain.com.ar/*)仅匹配此字符:** A-z0-9** 并发送到端口 3000 上的私有 ip 2,我也需要发送通配符(例如http://private.ip.2:3000/wildcard-word)

我只是想在我的第二点上取得成功,但我无法应对。

server {
    listen 80;
    server_name ******.com.ar www.******.com.ar;

    location / {
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass         "http://private.ip.1:80/";
    }

    location ~ ^/(.*)/?$ { 
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass         "http://private.ip.2:3000/$1";
    }
}

但这行不通。当我转到http://example.com.ar时,我直接转到端口 3000 上的私有 ip 2。顺便说一句,在另一种情况下,当我使用 nginx -t 时出现以下错误命令:"proxy_pass" 的 URI 部分不能位于正则表达式给出的位置或命名位置

那么,任何人都可以帮助这个菜鸟解决他的问题吗?提前致谢。我将让我正在阅读的链接如下:

  • 通配符 url 的 nginx 规则

  • 基于uri路径的nginx位置

  • 如何使用 Nginx 进行 URL 重定向

  • 如何使用proxy_pass重写URI nginx反向代理?

  • 了解 Nginx 服务器和位置块 (DigitalOcean)

解答

您想使用location / { ... }块作为通配符,因为它匹配任何不匹配另一个location块的 URI。

您不需要在proxy_pass语句中使用 URI 组件,因为您不会在将 URI 发送到上游之前对其进行修改。详见本文档。

您可以通过在外部块中指定proxy_set_header语句并允许它们被两个location块继承来节省打字。详见本文档。

例如:

proxy_set_header   X-Forwarded-For $remote_addr;
proxy_set_header   Host $http_host;

location ~ ^/(company|portfolio|services|contact|)(/|$) {
    proxy_pass         "http://private.ip.1:80";
}

location / {
    proxy_pass         "http://private.ip.2:3000";
}
Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐