使用 NGINX 将一个网站代理到另一个网站

使用 NGINX 将一个网站代理到另一个网站

我有一个网站,其中包含一些网址(http://位置:端口/) 并希望使用 NGINX 来代理它。

我有另一个网站,位于 (http://位置2:端口2) 并且也想代理它,这样。

  1. http://main.com站点 1 可通过以下方式访问:
  2. http://main.com/site2站点 2 可通过其所有子链接访问

我的尝试失败了。

server {
    listen  80;

    index index.html;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://landing-page:5000;
        proxy_redirect off;
    }

    location /insights {
        return 302 $uri/;
    }

    location /insights/ {
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header Host $http_host;
        # proxy_set_header X-NginX-Proxy true;

        rewrite ^/insights/?(.*) /$1 break;

        proxy_pass http://ghost:2368/;
        # proxy_redirect off;
    }
}

附加信息

我在 Docker 上运行 NGINX,并且必须在 Mac 上将端口 80 映射到 8080。

我发现的是这个:

  1. http://localhost:8080/insightshttp://localhost/insights/在浏览器中将URL 设置为
  2. http://localhost:8080/insights/ghost将 URL 设置为http://localhost:8080/ghost/
  3. http://localhost:8080/insights/将 URL 设置为http://localhost:8080/insights/
  4. http://localhost:8080/insights/ghost/将 URL 设置为http://localhost:8080/insights/ghost/

任何以斜线结尾的 URL 似乎都可以正常工作。为什么?

答案1

您的location /块应位于文件末尾。位置块按顺序处理,第一个匹配的块将被执行。由于location /匹配每个请求,因此它将始终被执行。

一般来说,您应该首先拥有最具体的块,然后是不太具体的块,最后location /以所有其他请求结束。

你的文件应该这样布局:

server {
    listen  80;

    index index.html;

    location /insights/ {
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header Host $http_host;
        # proxy_set_header X-NginX-Proxy true;

        rewrite ^/insights/?(.*) /$1 break;

        proxy_pass http://ghost:2368/;
        # proxy_redirect off;
    }

    location /insights {
        return 302 $uri/;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://landing-page:5000;
        proxy_redirect off;
    }
}

相关内容