如何在不同的URL上显示远程页面,就像它位于本地URL

时间:2018-03-23 19:59:36

标签: php html5 url

我想模仿负载均衡器,如果一个人去

http://example.com/mysite

他们要么看到以下内容:

http://server2.example.com/mysite

http://server3.example.com/mysite

使用PHP我可以随机确定用户去哪个网站,但如何在http://example.com/mysite显示?我是否以某种方式使用占据窗口整个高度和宽度的iframe?或者有更好的方法吗?

基本上,我希望用户只能在地址栏中看到http://example.com/mysite,并且不知道他们正在查看该页面的服务器。如果他们查看源代码以查看它,我不介意,但我想确保URL是相同的。

这两个站点使用JavaScript(服务器端和客户端),PHP和HTML。这些站点也在服务器端JavaScript(Node)上使用长轮询。

更新

感谢Lawrence Cherone的建议,我在Apache中实现了一个负载均衡器,如下所示:

<VirtualHost *:80>
        ServerAdmin webmaster@example.com
        ServerName jpl.example.com

        ProxyRequests off

        <Proxy "balancer://mycluster">
                BalancerMember "http://203.0.113.22:3000"
                BalancerMember "http://203.0.113.23:3000"
        </Proxy>

        ProxyPass "/test/" "balancer://mycluster/"
        ProxyPassReverse "/test/" "balancer://mycluster/"

</VirtualHost>

剩下的两个问题:

第1期

为了允许子目录,我必须在ProxyPassProxyPassReverse行添加尾部斜杠。

这适用于:

jpl.example.com/test/ =&gt; http://203.0.113.22:3000

jpl.example.com/test/subdir1/ =&gt; http://203.0.113.22:3000/subdir1/

jpl.example.com/test/subdir2/ =&gt; http://203.0.113.22:3000/subdir2/

但如果我放弃尾随斜线,那就不会工作:

jpl.example.com/test

jpl.example.com/test/subdir1 

jpl.example.com/test/subdir2 

如果用户忽略输入尾部斜杠,那么如何使其工作?

第2期

第二个问题变得太复杂,所以我把它移到了its own question。问题涉及长轮询不再有效,因为它找不到socket.io。

3 个答案:

答案 0 :(得分:0)

以下是网站网址中的iframe,根据网址中设置的变量,它可以很容易地成为SESSION变量,基于IP地址等等,这就是你要找的东西吗?

  <service name="TravelRequestWebService.TravelRequestService">
     <endpoint
         address="web"
         binding="basicHttpBinding"
         bindingConfiguration="basicHttpBinding"
         contract="TravelRequestWebService.ITravelRequestService" />
     <endpoint
         address="json"
         binding="webHttpBinding"
         behaviorConfiguration="jsonBehavior"
         bindingConfiguration="webHttpBinding"
         contract="TravelRequestWebService.ITravelRequestService" />
     <endpoint
         address=""
         binding="basicHttpBinding"
         contract="TravelRequestWebService.ITravelRequestService" />
  </service>

答案 1 :(得分:0)

如果您正在尝试构建实际的负载均衡器,请不要使用PHP。拆分服务器的负载是服务器的功能,而不是您的应用程序。但假设你的问题背后有一些合理的理由,我会尽力回答。

从技术上讲,你可以用一个简单的包含来做到这一点:

<?php include 'http://'.$subdomain.'.example.com/mysite'; ?>

但由于每次请求时都会下载页面,因此无法执行此操作。相反,您可能希望将页面写入文件以进行缓存。所以你的php会做类似这样的伪代码:

if cache file exists for this page
    get contents of file
    echo contents of file
else 
    get page from the other server
    write it to a cache file
    echo contents of file

答案 2 :(得分:0)

要重定向到用户不可见的网站(在地址栏中),您可以执行以下操作:

  1. 使服务器重定向到server2或server3。 (你已经做过的女巫。)
  2. 在您重定向到的页面内,插入这段JS代码:
  3. <script>
        window.history.pushState("", "[Title (ignored by most browsers)]", "[relative addres for the url you want to simulate (eg.: //example.com/mysite]");
    </script>
    

    当服务器将浏览器重定向到加载页面时,此脚本将运行,将假地址插入地址栏。

    更多信息:Updating address bar with new URL without hash or reloading the page

    PS。:重新加载页面会导致虚假地址加载。浏览器中的前向导航按钮可能无效。