首页 > 其他分享 >多域名路由访问站点子目录

多域名路由访问站点子目录

时间:2023-02-26 14:11:15浏览次数:35  
标签:请求 SendToPath 子目录 地址 System 域名 using 目录 路由

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

标签:请求,SendToPath,子目录,地址,System,域名,using,目录,路由
From: https://www.cnblogs.com/webconfig/p/17156596.html

相关文章

  • java——spring boot集成RabbitMQ——如何实现手动ack——topic——路由模式——代码
    发送方:pom文件:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-......
  • 百度二级域名批量添加(白狐 公羊seo)
    别人的批量二级添加:1.打码成功率低2.模拟填表就是在你电脑上无限打开浏览器操作,你无法去做其他工作3.软件中途出错,4.添加域名过慢几十秒添加一个域名我们的批量二级域......
  • vue路由守卫并向后台发送token
    vue代码//全局路由首位;当路由发生异常首先执行的方法router.beforeEach((to,from,next)=>{//是否被认证varisAuthenticated=false;//1.从localStorage......
  • 缓存路由数据组件
    切换组件时组件会被销毁,如果想切页面还不会被销毁就使用<keep-alive></keep-alive>标签可以使展示的内容切换组件时不进行销毁如果只给路由占位符外写一个keep-alive那......
  • 编程式路由导航
    介绍:编程式导航就是给元素写事件,可以使用query或replace进行传递数据代码:<template><divclass="aboutone"><h1>我是Homeone</h1><ul>......
  • linux服务器双网卡路由设置
    最近在调试linux服务器双网卡配置时,会碰到内网不通的情况,这里记录一下注意事项。1.排查自身网络配置是否正确。     注意:双网口配置时,只配置一个网关即可(内网......
  • python-flask之路由
    简单示例如下fromflaskimportFlaskapp=Flask(__name__)@app.route('/hello')defhello():return'hello'@app.route('/books')defbooks():retu......
  • 域名
    介绍域名网域名称(英语:DomainName,简称:Domain),简称域名、网域。域名是互联网上某一台计算机或计算机组的名称。域名可以说是一个IP地址的代称,目的是为了便于记忆。例如,wi......
  • tp-link路由器后台_硬解
    title:脚本_tp-link路由器后台_硬解author:杨晓东permalink:脚本date:2021-10-0211:27:04categories:-投篮tags:-demo脚本_tp-link_路由器后台_硬解impor......
  • 路由的params参数 组件之间通过路由传递数据
    介绍:组件之间可以通过路由query参数传递数据需求:  路由配置:importVuefrom"vue";importRouterfrom"vue-router";importHomefrom"./views/Home.vue";i......