1

我正在寻找一种解决方案,该解决方案将面向外部的http://mycompany.com/external/*重定向/代理重定向到http://internal-host:1234/internal/* (星号用作通配符)

好的,我猜上面那句话还不够,所以这里是细节:

在我的 Intranet 中,我有几台服务器(为简单起见,名称、地址、端口和上下文路径显然是虚构的):

  1. HRServer 在地址运行10.10.10.10:1010/hr
  2. 邮件服务器在地址运行20.20.20.20:2020/mail

我的系统只能从 ip 78.78.78.78 访问互联网,这里的限制是我只能使用一个端口(例如 8080)。换句话说 - 无论我的问题的解决方案是什么 - 外部地址都应该以78.78.78.78:8080

我需要做的是通过这个端口公开 HR 和 Mail 服务。我想到的第一件事是编写两个简单的 portlet(或带有两个框架的 HTML)并将它们嵌入到 78.78.78.78:8080/ 的简单网页中,但显然这不起作用,因为 portlet 将重定向浏览器到例如 10.10.10.10:1010/hr,这在互联网上是不可见的。所以我的下一个想法是——好的,让我们找到一个具有调度能力的反向代理。然后我可以制作

  • 78.78.78.78:8080/hr“重定向”到内部10.10.10.10:1010/hr
  • 78.78.78.78:8080/mail“重定向”到内部20.20.20.20:2020/mail

我还希望,如果在未读邮件上看到邮件服务器未20.20.20.20:2020/mail/unread读邮件,也可以从互联网访问。粗略地说-我希望

  • 78.78.78.78:8080/mail/* 重定向到内部20.20.20.20:2020/mail/*(星号用作通配符)

我真的觉得我在这里错过了明显的东西,但老实说 - 我花了很长时间研究几个代理,但我没有找到答案。我可能正在寻找错误的单词或其他内容,但我找不到可以配置为将外部路径分派到不同内部路径的反向代理。

所以请 - 如果答案是例如 Apache mod_proxy - 请给我一个关于我应该寻找的参数名称的提示。最后 - 我将在 FreeBSD 操作系统中运行瘦身,但这不是一个严格的要求(其他 *nix 操作系统也可以)谢谢!

4

1 回答 1

1

花了很长时间,但这里是答案:

一个好的解决方案是nginx(发音为“Engine X”)。

要重新路由到达的所有流量 https://mycompany.com/external/*http://internal-host:1234/internal/*星号用作通配符),您需要具有以下配置:

location ~ ^/internal/ {
   rewrite ^/internal/(.*)$   /$1 break;
   proxy_pass     http://internal-host:1234;

}

这种方法可用于所有其他地址——例如 HR 门户、邮件等。

最后,提醒您 - 以下配置不起作用:

location ~ ^/internal/(.*)$ {
  proxy_pass     http://internal-host:1234/internal/$1;
}

事实证明,当使用正则表达式时,nginx 将始终代理传递整个 URI,因此规则必须是上面的规则(它执行 url-rewrite)。

于 2013-03-07T13:57:09.527 回答