【问题标题】:Suggestion on developing a RETS PHP Tunnel关于开发 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:我无法将我的网站转移到专用服务器上,因为在不久的将来我会拥有很多这样的服务器,而且它们会花费太多。

【问题讨论】:

    标签: php http-tunneling rets proxytunnel


    【解决方案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 和端口号的区别。
    猜你喜欢
    • 2011-06-01
    • 2020-02-22
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多