我创建了一个AMP web应用程序,最初将从传统的第三方主机提供服务。
当我们完成时,客户决定在内部托管它,在他们办公室网络的服务器上。该应用程序仅供工作人员使用,但这些工作人员通常不在现场。我没有参与设置他们的网络,他们至少使用一台运行windows server 2003的服务器。我看到的客户端机器都是XP。
我在server 2003机器上设置了Apache, MySQL和PHP,并安装了应用程序。该应用程序构建在CodeIgniter框架上,因此我将base_url设置为内部IP(192.168…),我们从网络内部进行测试。一切正常
接下来,我们要求他们的网络人员为apache打开80端口。我将base_url设置为外部IP,并从我的家中进行测试(使用外部IP作为web地址),它工作得很好。
然而,当试图从网络内使用外部IP访问应用程序时,他们无法连接。我可以将base_url重置为网络IP,他们可以使用网络IP访问它,但是如果应用程序在连接外部时失败(因为整个应用程序使用的base_url指向内部IP)。
它假设我可以让CodeIgniter确定base_url(通过将变量保留为空字符串),但宁愿找出外部IP在网络中失败的原因,并尝试纠正它。
我们使用的服务器不是专用于AMP堆栈(事实上,它至少有一个其他应用程序广播到互联网,必须使用IIS,以及用于办公室扫描仪的FTP服务器),所以我想可能会有一些冲突。
我对windows网络知之甚少。快速搜索表明这可能是因为NAT,但没有提供解决方案。
他们的网络人没有任何建议,并说一切都应该很好。
是否有可能让网络内部的用户使用外部IP访问Apache服务器,如果是这样,需要发生什么才能启用?
TYIA
您的客户端的NAT路由器配置为在重写数据包中的源地址和目的地址后,将到达其外部接口的外部IP(端口80
)的数据包转发到内部机器(端口80
)。
从网络内部,尝试连接到外部IP地址将被路由到机器上的默认路由,路由器的内部接口。此接口未配置为将数据包转发回网络。
配置应用程序监听所有IP地址。确保服务器知道客户端在几个主机名下知道它——内部IP地址和外部IP地址。
您可能能够在路由器上重写NAT防火墙规则,以执行内部接口的端口转发,但是家庭和小型企业中常见的非外壳设备不使这项任务变得容易。更昂贵的设备(或自制的*BSD/Linux路由器机器)可以不费多大力气地做到这一点,但它会不必要地增加路由器的流量。
这与Apache无关,也与CI无关。从网络内部访问外部IP地址通常是不可能的。
坦率地说,我不知道这到底是为什么。我知道这与NAT(网络地址转换)如何工作或至少如何实现有关。 关于为什么这样做的详细概述,您应该在serverfault上询问这个问题。如果你只是一个必须处理它的程序员,请接受NAT通常只从内到外和从外到内工作,而不是从内到内。你已经在你的问题中提到了一个解决方案——不要使用base_url
。您也可以简单地在外部IP地址上运行服务器(不是您公司的IP,而是数据中心之类的)。