关于开发 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 的建议的主要内容,如果未能解决你的问题,请参考以下文章

2016-中国移动号码归属地查询(省市代码)

无法使用 PHP 函数 ssh2_tunnel 创建 SSH 隧道

mysql联合都不起作用

关于云开发数据库的使用经验和建议

关于PHP新手学习的一些指导与建议,新手快到我碗里来!

POJ2892 Tunnel Warfare