我在主机 B-beta 上运行 OpenNMS,其 URL 如下:
http://b-beta:8980/opennms
我想使用 NginX 来隐藏从主机 a-alpha 访问的路径,如下所示:
https://a-alpha/omber/nms
所以我想我需要重写发送到后端的请求以将路径从 /omber/nms 更改为 /opennms - 但对用户不可见 - 这是可以做到的吗?
HTTPS 已经运行良好。
答案1
第一步是将来自 Nginx 的请求代理到您的其他服务器。在 a-alpha 上:
location /ombre/nms {
proxy_pass http://b-beta:8980/opennms
}
从这里开始,剩下的配置非常依赖于 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/;
这应该相当于proxy_redirect default
包含在上面的位置块中。
rewrite ... break
:如果您需要修改正在发送到 opennms 的路径(中断意味着只会处理当前位置块)。
rewrite /ombre/nms/a/(.*) /opennms/b/$1 break;
proxy_set_header
:如果您需要修改一些发送到后端的标题。
默认情况下,Nginx 会将 Host 标头设置为$proxy_host
。如果您在 b-beta 上设置 OpenNMS,使其表现得像在 a-alpha 上运行一样(例如,告诉它该域是 a-alpha 的域,设置与 a-alpha 匹配的服务器块等),那么您将需要传递 a-alpha 收到的 Host 标头,而不是让 Nginx 修改它:
proxy_set_header Host $host;