Nginx代理传递与重定向不工作

wbgh16ku  于 2023-10-17  发布在  Nginx
关注(0)|答案(2)|浏览(175)

我有一台IP为192.168.1.10的服务器,它安装了一个名为kubesktop的系统,访问地址是**http://192.168.1.10:30880
当我们第一次访问它时,它会重定向到一个登录页面让我们登录,然后我们可以去它的主页,重定向代码类似于下面(以
斜杠**结尾)

<a href="/login" target="_blank">Login</a>

现在我在另一台ip为192.168.1.15的服务器上安装了nginx,我想通过nginx访问系统,因此我添加了以下代码:

location  /kubesphere/ {
          proxy_pass  http://192.168.1.10:30880;

          proxy_set_header Host $host:$server_port;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_connect_timeout 600;
          proxy_send_timeout 600;
          proxy_read_timeout 600;
          send_timeout 600;
  }

但是当我在浏览器上输入**http://192.168.1.15/kubesphere时,它会给予我一个404 Not Found**的响应,检查我在下面找到的nginx日志消息

2023/09/05 15:09:54 [error] 51162#51162: *9802010 open() "/usr/share/nginx/html/login" failed (2: No such file or directory)

redirect命令没有重定向到**http://192.168.1.10/login,而是访问/usr/share/nginx/html/login**,这使得它不能正常工作,使用proxy_pass后,预期的url是**http://192.168.1.10.30880/login**,但我自己做不到。

我已经尝试了很多,包括chatGPTHoHoGPT,但仍然没有得到一个解决方案,有人能帮助我吗?
提前感谢!
更新:一个可用的测试地址是**http://182.92.238.5:30880/,我们可以用它来测试!
我需要
http://192.168.1.15/kubesphere**,这意味着实际的ip和端口不应该出现在浏览器上!

frebpwbc

frebpwbc1#

对于你的问题,尝试Nginx重写而不是代理传递。

rewrite ^/(.*)$ http://182.92.238.5:30880/$1 permanent;

下面是解释。
1.^/(.)$:这是一个正则表达式模式,匹配任何URI(统一资源标识符)路径。它的意思是:^:将模式添加到字符串的开头。/:匹配正斜杠字符,这是URI中常见的斜杠。(.):这部分是一个捕获组((...)),.* 匹配零个或多个除换行符之外的任何字符(.)。这可以有效地捕获首个正斜杠之后的任何字符串。
因此,这个正则表达式捕获整个URI路径。

  1. http://182.92.238.5:30880/$1:这是一个重定向URL。它指定服务器在匹配正则表达式模式后应将客户端请求发送到何处。http://182.92.238.5:30880/:这是请求将被重定向的基本URL。
    1.$1:这是从正则表达式中对捕获组的反向引用。在这种情况下,它引用了(.*)捕获的整个URI路径。捕获的路径将附加到基本URL。
  2. permanent;:此部分指定HTTP重定向的类型。在这种情况下,它是一个“永久”重定向,这意味着客户端的浏览器将缓存此重定向,并将其用于对同一URI的后续请求。
    把所有这些放在一起,这个配置规则是说:
    将任何URI路径(^/(.*)$)重定向到http://182.92.238.5:30880/,后跟捕获的路径($1),并使此重定向永久化。
    例如,如果客户端请求http://example.com/some/path,它将被永久重定向到http://182.92.238.5:30880/some/path
    所以,最后,把你的位置块换成下面的,
location  /kubesphere/ {
          rewrite ^/(.*)$ http://182.92.238.5:30880/$1 permanent;
          proxy_set_header Host $host:$server_port;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_connect_timeout 600;
          proxy_send_timeout 600;
          proxy_read_timeout 600;
          send_timeout 600;
  }
nnsrf1az

nnsrf1az2#

谢谢你的测试地址,这真的很有帮助。
您的问题与nginx无关。反向代理部分工作正常,nginx获取请求并成功转发到应用程序。然后应用程序发送重定向到/login。这意味着浏览器确实做到了这一点,它重定向到<host>/login。为了解决这个问题,你需要让kubesktop知道它正在子路径(/kubesphere)上运行,这样它就可以相应地创建重定向(<host>/kubesphere/login)。不幸的是,我找不到任何简单的方法来做到这一点,只是使用谷歌,但我也没有进入kubesktop软件。也许这些信息可以帮助你解决问题。如果你找到一种方法告诉kubesktop它正在子路径上运行,它将创建正确的重定向,并且它将正常工作。
目前,重定向仅在kubesktop在根路径上运行时才有效。一个选项是使用子域,以防您使用域而不是IP地址。
希望有帮助:)

相关问题