多域名路由访问站点子目录
1.域名解析
所有请求域名解析到目标服务器,为了便于日后迁移维护,应使用别名解析的方式。
2.网站主机头
为了接收多域名的访问请求,网站不再设置固定主机头,而是使用空主机头的方式。
匹配顺序为:IIS接到访问请求时,根据域名,首先进行主机头匹配,当匹配到有绑定的主机头时,该主机头的网站进行响应。当无法匹配到绑定的主机头时,空白主机头的网站进行响应。
空白主机头IIS下的站点可以设置多个,但只能同时运行其中一个。
3.HTTP请求接管
使用URLRewriter.dll的程序集,并单独编写一个处理逻辑,以override的方式对URLRewriter.BaseModuleRewriter中的Rewrite方法进行定制,接管http请求进行路由分发处理
需要考虑请求地址是目录还是具体文件的两种不同情形。
请求地址如果是目录的情况下,接管逻辑会针对目录首先运行一次,在请求具体网页文件时,接管逻辑会再次运行一次。
因此接管处理逻辑如果仅仅在原有请求地址上增加前置目录的话,遇到目录地址的请求会重复增加前置目录,导致重写的地址错误。需要分情况处理。
在web.config文件中进行注册,使接管处理逻辑生效,注册时锚定的是命名空间.类
1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Web; 5 using System.Web.Security; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 using System.Web.UI.WebControls.WebParts; 9 using System.Web.UI.HtmlControls; 10 11 namespace RG.SiteHub 12 { 13 /// <summary> 14 /// router 的摘要说明 15 /// </summary> 16 17 public class Router : URLRewriter.BaseModuleRewriter 18 { 19 protected override void Rewrite(string requestedPath, HttpApplication app) 20 { 21 string path = requestedPath; 22 Uri url = new Uri(path);//把请求地址字符串转换为URI对象 23 string domain = url.Host; //获取域名部分 24 string SendToPath = url.PathAndQuery; //获取目录,文件,参数部分 25 if (domain == "xxx.com") //匹配请求域名 26 { 27 //判断以“/”为分割的最后一段,是否包含“.”,即可判断来访地址是目录地址还是具体文件 28 string[] sArray = path.Split('/'); 29 string laststr = sArray[sArray.Length - 1]; 30 if (!laststr.Contains(".")) 31 { 32 //不包含“.”时请求地址是目录,需要再次判断最后是否带“/” 33 if (SendToPath.Substring(SendToPath.Length - 1, 1) != "/") 34 { 35 //若不带“/”需要补上 36 SendToPath = SendToPath + "/"; 37 } 38 //当请求地址是目录时,重写地址补上目录中的默认文件,同时打上参数标记,以示区分请求类型 39 /* 40 * 详细说明: 41 * 当请求类型为文件时,重写地址加上前置目录可以正常访问 42 * 但请求类型为目录时,ASP.NET会首先进行处理一次请求,加上前置目录,在请求默认文件时,会再次进行处理,前置目录就会被重复加上,导致无法重写到真正的地址 43 * 在处理请求发现来源地址是目录时,重写至默认文件并打上标记 44 * 在处理文件类型的请求时,首先判断是否存在标记,若有标记,不再重复添加前置目录 45 */ 46 SendToPath = "/sites/001" + SendToPath + "index.aspx?from=dir"; 47 } 48 49 //判断是否有标记 50 if (!SendToPath.Contains("?from=dir")) 51 { 52 SendToPath = "/sites/001" + SendToPath; 53 } 54 app.Context.RewritePath(SendToPath);//设置重写地址 55 } 56 } 57 } 58 }
<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0"/> <httpModules> <add type="RG.SiteHub.Router" name="URL"/> </httpModules> <authentication mode="Windows"/> <customErrors mode="Off"/> </system.web> </configuration>
4.让ASP.NET接管所有类型的文件
默认情况下,ASP.NET只接管动态文件资源,对于html、img、js、css等静态资源不予处理,需要手动添加映射才能让所有资源类型全部纳入ASP.NET的处理范围。
选择目标站点 - 处理程序映射 - 打开之后的空白处右键 - 添加通配符脚本映射 - 可执行文件选择相应.net版本的aspnet_isapi.dll即可。
鸣谢:
参考:https://blog.csdn.net/os2046/article/details/7714328
作者:冰山英雄
本文作者:码农隐于朝
文章地址:https://www.cnblogs.com/webconfig/p/17156596.html