现在有一个网站,我需要将这个网站所有页面都映射一个虚拟路径的虚拟镜像:比如页面地址 http://www.csdn.net/abc.aspx 镜像就是 http://www.csdn.net/new/abc.aspx,即在根路径下加一层虚拟路径/new,但镜像内容还是从实际页面取得的,只是做一定的处理,比如给页面替换一个logo、顶部加几行信息等,用的Response.Filter。
这个虚拟镜像有一个入口,比如说首页上的链接 http://www.csdn.net/new/start.aspx。在global.asax中将对所有带/new路径的请求进行像上面所说的额外处理。如果不带/new路径,但是Request.UrlReferer是虚拟镜像路径,也就是带有/new,那么该请求也应该转到该页面的虚拟镜像上,
但还要使让浏览器上的地址变成一个镜像地址。一是为了让浏览者知道这是一个新的网址,二是为了保持 Request.UrlReferer的镜像特性。因为页面很多,每个页面链接又很多,
这样使新的镜像页面,打开的链接依然是镜像页面,因为我不能改变原有页面文件里的链接。。
说了这么多,可能未必明白,贴一下我现在global.asax的处理方式,先Redirect再Transfer。
string VirtualPath = "/new"; string Root = "http://www.csdn.net";
if (Url.Contains(VirtualPath))
{
addFilter(); //这方法是设置Response.Filter
Server.Transfer(Url.Replace(Root + VirtualPath, ""));
return;
}
if ((Url.Contains("new/start") && !Url.Contains(VirtualPath)) || (Request.UrlReferrer != null && Request.UrlReferrer.ToString().Contains(VirtualPath)))
{
Response.Redirect(Url.Replace(Root, Root + VirtualPath));
}
这样对于普通页面基本可以用,但是一旦页面回发就有问题了,我在 form上加onsubmit="this.action=document.location.href"可以回发到虚拟路径,但是虚拟路径上该如何处理请求并将结果返回?
如果在实际路径处理,处理后该如何让浏览器地址为镜像地址(Request.Urlreferer)?
好像 Server.TransferRequest可以实现,但要IIS7.0+.Net 3.0支持。除此外有什么好的方式呢?