我们正在构建一个移动网站,其网址结构与我们当前的桌面网站相匹配。我们在同一个域上托管它们,并使用apache使用WURFL过滤它们之间的流量,以帮助确定哪些代理到哪里。
我们的过滤规则目前如下:
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,它会提供来自桌面服务器的内容。
即如果移动设备请求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 :(得分:0)
不要认为有办法使用mod_rewrite来做到这一点。因为您使用[P]
标志进行代理,RewriteRule
将代理请求交给mod_proxy,甚至不知道它是否通过。如果所有内容都位于同一文档根目录中(或至少是文档根目录的子目录),则可以使用-f
条件检查来查看文件是否存在。
你可以尝试做的事情虽然我不知道这是否有用,但是使用了mod_proxy的ProxyErrorOverride
along with ErrorDocument
。如果您的ProxyErrorOverride
已打开,理论上如果代理请求返回错误,mod_proxy将使用本地错误处理程序而不是代理错误处理程序。然后你可以使用ErrorDocument 404
用PHP脚本或其他东西来处理代理404,然后做一些关于通过本地重写引擎重新路由它(可能带有特殊查询字符串参数的重定向?)所以它可以代理到桌面域。