关于开发 RETS PHP Tunnel 的建议
Posted
技术标签:
【中文标题】关于开发 RETS PHP Tunnel 的建议【英文标题】:Suggestion on developing a RETS PHP Tunnel 【发布时间】:2012-07-18 16:04:11 【问题描述】:我已经部分开发了一个从 RETS IDX 获取房产数据的房产网站。您可能知道 RETS 服务器通过 http 协议侦听端口 6103。我的网站部署在共享主机上,因此无法连接到 6103 端口。我确实有一个专用服务器(允许连接到端口 6103)。我想使用这个专用服务器作为我的网站和 RETS IDX 服务器之间的中间层。我的问题是我想开发那个中间层脚本,即 HTTP 隧道。
我的网站会将所有 RETS 请求发送到此隧道,同时将其发送到 RETS IDX 服务器,其响应将同时发送回网站。
port 80 port 6103
Website (shared hosting) ----------> Tunnel (Dedicated hosting) -----------> RETS Server
RETS Server 也需要登录,所以会话应该保持正常。
我想要快速/最佳的解决方案来完成这项工作。可能是通过 .htaccess 或流式 php 脚本,也可能是一些第三方脚本也可以减少我的一些时间。
我很想听听您的任何想法或建议。
P.S:我无法将我的网站转移到专用服务器上,因为在不久的将来我会拥有很多这样的服务器,而且它们会花费太多。
【问题讨论】:
【参考方案1】:我个人会选择Reverse Proxy 方法。这将允许您根据可配置的标准智能地转发请求。
Apache 和 nginx 都具有反向代理功能(实际上这是 nginx 的初衷)。对于 Apache,您需要使用 mod_proxy
,而 nginx 具有内置功能,除非您在编译前明确禁用它。
在这两个选项中,我个人更喜欢 nginx,它健壮且轻量级,完全适合用途。我发现 Apache 比较麻烦,但是如果您已经在专用服务器上设置了 Apache,您可能更愿意使用它。
使用网络服务器进行代理的美妙之处在于它们了解底层协议。它们将保留标头、修改 cookie(保留会话)并正确翻译主机名。
Apache 配置
在这两种情况下,配置都非常简单,Apache 配置如下所示:
<Location /proxy-location/>
ProxyPass /rets http://rets-server:6103/api/path
ProxyPassReverse /rets http://rets-server:6103/api/path
</Location>
还有调整 cookie、设置超时等选项。所有这些都可以在 mod_proxy documentation 中找到
您应该注意,这个不能进入.htaccess
文件。它必须放在主服务器配置中。
nginx 配置
同样简单
location /proxy-location
proxy_pass http://rets-server:6103/api/path;
HttpProxyModule documentation 中再次有大量选项用于缓存、重写 url、添加标题等。
请做查阅文档。我没有测试过这些配置中的任何一个,它们可能有点偏离,因为它们来自记忆 + 快速谷歌。
确保您通过代理到无法访问的服务器来测试您的应用,并确保它正确处理故障,因为您正在引入另一个故障点。
我正在假设您能够配置自己的专用服务器。如果不是这种情况,您的房东可能愿意帮助您。如果不给我留言,我会尝试提出更强大的 curl 选项。
【讨论】:
完美!这正是我一直在寻找的。我已经在我的机器上本地实现了它。在我收到 404 错误之后,它适用于前几个请求(登录)。可能我们需要添加一些参数来保持连接有效吗?或者它可能没有通过 cookie/会话? @FatalError:您必须查看日志文件并找出 404 的确切用途。它是您的代理服务器上的 404,因为返回了重定向并且它没有满足它,或者它是 RETS 服务器上的 404,它只是被转发回给您。将日志设置为 stun,并准备编写一堆规则来满足所有需求:) 代理不适用于多部分内容,即图像。可以看看serverfault.com/questions/410730/…吗?【参考方案2】:您可以通过使用 curl 的 PHP 扩展来实现。
示例代码可以是:
$url = $_GET['url'];
$ch = curl_init( $url );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
echo $content;
显然你必须添加保护,也许添加 .htaccess/.htpasswrd 保护。
可以在此处找到更完整的代码,包括 cookie 支持等:https://github.com/cowboy/php-simple-proxy
【讨论】:
它不会将接收到的 headers 发送到 $url。此外,它没有保存会话的能力。我希望脚本将每个接收到的信息发送到 $url 或转发 url,即标头、会话、cookie、http 身份验证,所有内容都只有 url 和端口号的区别。以上是关于关于开发 RETS PHP Tunnel 的建议的主要内容,如果未能解决你的问题,请参考以下文章