使用 Nginx 隐藏后端路径

Luk*_*asz 5 rewrite nginx

我在主机 B-beta 上运行 OpenNMS,其 URL 如下:

http://b-beta:8980/opennms
Run Code Online (Sandbox Code Playgroud)

我想使用 NginX 来隐藏可从主机 a-alpha 访问的路径,如下所示:

https://a-alpha/omber/nms
Run Code Online (Sandbox Code Playgroud)

所以我想我需要的是重写发送到后端的请求以将路径从 /omber/nms 更改为 /opennms - 但它对用户不可见 - 这是可以完成的事情吗?

HTTPS 已经可以正常工作了。

cyb*_*x86 4

第一步是将来自 Nginx 的请求代理到您的其他服务器。在α-α上:

location /ombre/nms {
    proxy_pass http://b-beta:8980/opennms
}
Run Code Online (Sandbox Code Playgroud)

从这里开始,其余的配置非常依赖于 OpenNMS(我不熟悉)的功能。

下一部分是处理重定向。如果请求来自客户端(例如,您的表单 POST 到 b-beta 上的 URL 或者您有指向 b-beta 的链接),那么您需要与 Nginx 分开解析这些请求。请记住,浏览器不知道代理 - 因此它将在不修改的情况下向服务器发送请求。

如果您查看 OpenNMS 登录页面(例如,现场演示)。登录表单 POST 到opennms/j_spring_security_check. 成功登录会导致:

  • 302 重定向到opennms,然后是
  • 302 重定向到opennms/frontPage.htm后跟
  • 302 重定向到opennms/index.jsp.

使用 Nginx,您无法(轻松)更改表单 POST 的路径(尽管这可能是 OpenNMS 配置选项),但您可以更改返回浏览器的重定向。有一些指令需要考虑:

proxy_redirect:如果您需要修改返回给浏览器的重定向(即位置标头)

proxy_redirect http://b-beta:8980/opennms/ http://a-alpha/ombre/nms/; 
Run Code Online (Sandbox Code Playgroud)

这应该等同于proxy_redirect default包含在上面的位置块中。

rewrite ... break:如果需要修改发送到opennms的路径(break意味着只处理当前位置块)。

rewrite /ombre/nms/a/(.*) /opennms/b/$1 break;
Run Code Online (Sandbox Code Playgroud)

proxy_set_header:如果您需要修改一些发送到后端的标头。

默认情况下,Nginx 会将 Host 标头设置为$proxy_host. 如果您在 b-beta 上设置 OpenNMS,就像它在 a-alpha 上运行一样(例如告诉它该域是 a-alpha 的域,设置服务器块匹配 a-alpha 等),那么您将需要传递主机标头由 a-alpha 接收,而不是让 Nginx 修改它:

proxy_set_header Host $host;
Run Code Online (Sandbox Code Playgroud)