2

我们正在构建一个移动网站,其 url 结构与我们当前的桌面网站相匹配。我们将它们托管在同一个域上,并使用 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))

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

这可以使用 mod_rewrite 吗?

4

1 回答 1

0

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

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

于 2012-08-10T10:23:19.963 回答