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

时间:2019-04-21 06:21:06

标签: nginx routes uri nginx-reverse-proxy segment

我正在尝试在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上的专用ip1。

但是,如今,我需要稍微调整配置文件。

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上的专用ip2。顺便说一句,在另一种情况下,当我使用 nginx -t 命令时,出现跟随错误:“ proxy_pass”不能在正则表达式指定的位置或命名位置内包含URI部分

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

1 个答案:

答案 0 :(得分:1)

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

proxy_pass语句中不需要URI组件,因为在向上游发送URI之前没有修改URI。有关详细信息,请参见df.merge()

通过在外部块中指定proxy_set_header语句并允许两个location块继承它们,可以节省键入的时间。有关详细信息,请参见this document

例如:

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";
}