我有一台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**,但我自己做不到。
我已经尝试了很多,包括chatGPT
和HoHoGPT,但仍然没有得到一个解决方案,有人能帮助我吗?
提前感谢!
更新:一个可用的测试地址是**http://182.92.238.5:30880/,我们可以用它来测试!
我需要http://192.168.1.15/kubesphere**,这意味着实际的ip和端口不应该出现在浏览器上!
2条答案
按热度按时间frebpwbc1#
对于你的问题,尝试Nginx重写而不是代理传递。
下面是解释。
1.^/(.)$:这是一个正则表达式模式,匹配任何URI(统一资源标识符)路径。它的意思是:^:将模式添加到字符串的开头。/:匹配正斜杠字符,这是URI中常见的斜杠。(.):这部分是一个捕获组((...)),.* 匹配零个或多个除换行符之外的任何字符(.)。这可以有效地捕获首个正斜杠之后的任何字符串。
因此,这个正则表达式捕获整个URI路径。
1.$1:这是从正则表达式中对捕获组的反向引用。在这种情况下,它引用了(.*)捕获的整个URI路径。捕获的路径将附加到基本URL。
把所有这些放在一起,这个配置规则是说:
将任何URI路径(^/(.*)$)重定向到http://182.92.238.5:30880/,后跟捕获的路径($1),并使此重定向永久化。
例如,如果客户端请求http://example.com/some/path,它将被永久重定向到http://182.92.238.5:30880/some/path。
所以,最后,把你的位置块换成下面的,
nnsrf1az2#
谢谢你的测试地址,这真的很有帮助。
您的问题与nginx无关。反向代理部分工作正常,nginx获取请求并成功转发到应用程序。然后应用程序发送重定向到
/login
。这意味着浏览器确实做到了这一点,它重定向到<host>/login
。为了解决这个问题,你需要让kubesktop知道它正在子路径(/kubesphere
)上运行,这样它就可以相应地创建重定向(<host>/kubesphere/login
)。不幸的是,我找不到任何简单的方法来做到这一点,只是使用谷歌,但我也没有进入kubesktop软件。也许这些信息可以帮助你解决问题。如果你找到一种方法告诉kubesktop它正在子路径上运行,它将创建正确的重定向,并且它将正常工作。目前,重定向仅在kubesktop在根路径上运行时才有效。一个选项是使用子域,以防您使用域而不是IP地址。
希望有帮助:)