2012-08-10 72 views
1

我们正在构建一个移动网站,其网址结构与我们当前的桌面网站相匹配。我们将它们托管在同一个域中,并使用apache来使用WURFL过滤它们之间的流量,以帮助确定哪些代理位置在哪里。Apache重定向下游404

我们的过滤规则,目前看起来是这样:

RewriteCond %{HTTP_COOKIE} "bucket=mobile" 
RewriteRule ^(.*)$ http://internal-mobile-pool.ourdomain.com/$1 [P] 

RewriteRule ^(.*)$ http://internal-desktop-pool.ourdomain.com/$1 [P] 

我们WURFL基础的解决方案设置“桶”的cookie我们。

我们面临的问题是,并非我们桌面版网站上的所有网址都已在我们的移动网站上重新实施。我理想上喜欢的是上述规则适用,但如果它尝试去移动服务器并获得404,它会提供来自桌面服务器的内容。

ie如果某个移动设备请求www.ourdomain.com/some_desktop_only_resource.html,并且internal-mobile-pool.ourdomain.com/some_desktop_only_resource.html返回一个404 - 以返回desktop-pool.ourdomain上的内容.COM/some_desktop_only_resource.html

要伪代码描述这个

if(isMobile) 
    response = getMobileResponse(url) 
    if(response.code != 404) 
     serveResponse(response) 
    else 
     serveResponse(getDesktopResponse(url)) 

我知道这是可能的,如果我列出所有在此文件中的支持网址 - 我想避免这种情况,我会像这个平台识别层独立于它所服务的应用程序。我也知道我可以通过重定向从移动应用程序本身解决这个问题,但如果可能的话,我希望这个平台识别层是独立的。

这是可能的使用mod_rewrite?

回答

0

不要以为有一种方法可以使用mod_rewrite来做到这一点。因为您使用[P]标志进行代理,所以RewriteRule将代理请求交给mod_proxy,甚至不知道它是否通过。如果所有内容都位于同一文档根目录(或至少是文档根目录的子目录),则可以使用-f条件检查来查看是否存在文件。

你可以尝试做的事情,虽然我不知道这是否可行,但是使用mod_proxy的ProxyErrorOverride along with ErrorDocument。如果您的ProxyErrorOverride处于打开状态,理论上如果代理请求返回错误,mod_proxy将使用本地错误处理程序而不是代理服务器。然后你可以使用一个ErrorDocument 404来处理代理404的php脚本或其他东西,然后做一些关于通过本地重写引擎重新路由回来(可能带有特殊查询字符串参数的重定向?),以便它可以是代理到桌面域。