nginx反向代理传递/重定向不工作

e5nqia27  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(174)

我正在尝试用nginx实现下面的功能-
我有2个Docker容器在服务器上运行,一旦容器在端口80上运行nginx并从AWS应用程序负载均衡器接收请求。然后根据URL中的路径,它应该重定向到另一个docker容器上的3个端口之一。在第二个docker容器中运行的应用程序在它们自己的路径上提供内容。
示例-当我输入https://example.com/story/fairy时,Nginx应该解析/story/fairy并将其传递给端口9091上的其他Docker容器。从应用返回的数据可以在路径/_myownpath/page1/上。浏览器的URL应该是-https://example.com/story/fairy/_myownpath/page1
然后,如果在这个返回的页面上有其他链接,用户点击了它们,nginx应该只将新路径传递给监听端口9091的应用程序,并说返回的新内容将在路径/_newpath/story_page_11上。浏览器URL现在应该看起来像https://example.com/story/fairy/_newpath/story_page_11等等。
我已经把我的头发分开玩nginx配置&还没有能够得到我的头周围,并得到这个权利。
我尝试过的一些配置包括
已尝试代理传递

server {
        listen 80;
        server_name example.com;
    
        location /story/fairy/ {
            # Reject requests with unsupported HTTP method
            if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
                return 405;
            }
    
            # Only requests matching the whitelist expectations will
            # get sent to the application server
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://localhost:9091/;
            proxy_redirect http://localhost:9091/ https://$server_name/;
        }
}

字符串
尝试重定向

server {
    listen 80;

    location /awsmap/dev/ {
        if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
            return 405;
        }

        return 301 http://localhost:9091/;
    }


试着重写

server {
    listen 80;

    location /story/fairy {
        rewrite ^/story(.*)$ / break;

        proxy_pass http://localhost:9091;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;

        absolute_redirect off;
    }

    location ^~ /story\/fairy/ {
    rewrite ^/story(.*)$ / break;

        proxy_pass http://localhost:9091;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;

        absolute_redirect off;
    }

}


我对nginx的使用经验不多。在这一点上卡住了让这个工作。
我真的很感激ay帮助让这个工作,请。

qltillow

qltillow1#

不同的Docker容器不能通过localhost(默认情况下)相互访问。在两个容器之间建立连接的推荐方法是,它们使用相同的docker-network,它们可以使用容器名称作为主机名进行通信。因此,将proxy_pass行更改为您的应用程序主机,应该可以修复它。
例如:

server {
    listen 80;
    server_name example.com;

    location /story/fairy/ {
        # Reject requests with unsupported HTTP method
        if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
            return 405;
        }

        # Only requests matching the whitelist expectations will
        # get sent to the application server
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://app-host:9091/;
    }
}

字符串

**注意:**使用docker compose,所有容器共享相同的docker-network,您可以/应该使用它。参见explanation

相关问题