NGINX 反向代理仅子目录

NGINX 反向代理仅子目录

我的 Web 应用程序有一个子目录,192.168.1.8:8088/messages我想将其作为公开给外部世界messages.mysite.com。我已经完成了一半,但似乎陷入了困境。我的要求如下

  1. 将站点从 HTTP 重定向到 HTTPS。
  2. 由于我无法编辑 Web 应用程序生成的链接,因此我需要能够接受来自客户端的请求,例如messages.mysite.com/messages?id=23023
  3. 不允许反向代理访问根 Web 应用程序,或者其子目录192.168.1.8:8088之外的任何子目录。192.168.1.8:8088/messages

我当前的 NGINX 配置存在一些问题。

  1. HTTP 到 HTTPS 重定向仅适用于基本路径。如果收到messages.mysite.com类似 的 HTTP 请求,我的服务器会重定向到,这是不正确的。这是因为我在设置中设置了,但如果没有它,我不知道如何重定向到。http://messages.mysite.com/messages?id=23023http://messages.mysite.com/messages/messages?id=23023/messagesreturn 301messages.mysite.com192.168.1.8:8088/messages

  2. HTTPS 站点允许访问完整的 Web 应用程序,,192.168.1.8:8088但我只希望它访问192.168.1.8:8088/messages

我的 NGINX 站点配置文件如下。如能得到任何帮助或指点,我将不胜感激。

server {
        listen                          80;
        server_name                     messages.mysite.com;
        return 301                      https://$server_name/messages$request_uri;
}

server {
        listen                          443 ssl;
        server_name                     messages.mysite.com;
        set                             $upstream 192.168.1.8:8088;

        ssl_certificate                 /etc/letsencrypt/live/messages.mysite.com/fullchain.pem;
        ssl_certificate_key             /etc/letsencrypt/live/messages.mysite.com/privkey.pem;
        include                         /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam                     /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        location / {
                proxy_pass                              http://$upstream;
                proxy_buffering                         off;
                proxy_set_header Host                   $http_host;
                proxy_set_header X-Real-IP              $remote_addr;
                proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto      $scheme;
        }
}

更新澄清:

例子

https://messages.mysite.com => 192.168.1.8:8088/messages
https://messages.mysite.com/messages?id=23023 => 192.168.1.8:8088/messages?id=23023
https://messages.mysite.com/messages/send_message => 192.168.1.8:8088/messages/send_message
https://messages.mysite.com/calendar => 404
https://messages.mysite.com/notmessages=> 404

答案1

在我看来你混淆了重定向反向代理。

重定向是服务器响应,告诉客户端加载另一个 URL。

反向代理是告诉服务器将请求发送到另一台服务器并将响应返回给客户端。

HTTP 到 HTTPS 的重定向应始终是将 HTTP URL 简单重定向到相应的 HTTPS URL,无需修改。在此步骤中很少需要修改 URL 路径。

因此,您的重定向块应该是:

server {
    listen                          80;
    server_name                     messages.example.com;
    return 301                      https://$server_name$request_uri;
}

messages.example.com要将到达的代理请求反向192.168.1.8:8088/messages,请使用以下配置:

server {
    listen                          443 ssl;
    server_name                     messages.example.com;

    ssl_certificate                 /etc/letsencrypt/live/messages.example.com/fullchain.pem;
    ssl_certificate_key             /etc/letsencrypt/live/messages.example.com/privkey.pem;
    include                         /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam                     /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location = / {
        proxy_pass                           http://192.168.1.8:8088/messages;
        proxy_buffering                      off;
        proxy_set_header Host                $http_host;
        proxy_set_header X-Real-IP           $remote_addr;
        proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto   $scheme;
    }

    location /messages {
        proxy_pass                           http://192.168.1.8:8088/messages;
        proxy_buffering                      off;
        proxy_set_header Host                $http_host;
        proxy_set_header X-Real-IP           $remote_addr;
        proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto   $scheme;
    }
}

我删除了变量,因为当和变量彼此相邻$upstream时,配置更容易读取。location /proxy_pass

此设置按如下方式转发请求:

https://messages.example.com/ => http://192.168.1.8:8088/messages
https://messages.example.com/?some=value => http://192.168.1.8:8088/messages?some=value
https://messages.example.com/message => http://192.168.1.8:8088/messagesmessage

proxy_pass操作记录在nginx 文档

相关内容