通过 URL Rewrite Module 组件

URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大工具。这个模块允许你将复杂的、不易于记忆或不利于搜索引擎优化的 URL 转换为更简洁、更友好的格式。通过 URL 重写,你可以提高网站的用户体验,增强搜索引擎排名,并更好地控制 URL 结构。

URL Rewrite Module 的主要特点包括:

  • 规则定义:你可以定义一系列规则,用于匹配传入的 URL 模式,并将其重写到新的 URL。这些规则可以基于正则表达式、通配符或其他逻辑进行定义,非常灵活。

  • HTTP 头和服务器变量:重写规则可以基于 HTTP 请求头、服务器变量或其他条件进行匹配和执行。这使得你可以根据特定的请求属性或上下文来定制 URL 重写逻辑。

  • 重定向和自定义响应:除了简单的 URL 重写,你还可以使用 URL Rewrite Module 来定义重定向规则,将用户从一个 URL 自动转发到另一个 URL。此外,你还可以发送自定义的 HTTP 响应或中止请求。

  • 性能优化:URL 重写模块在 IIS 管道中早期阶段处理请求,因此它不会对应用程序的性能产生负面影响。相反,通过优化 URL 结构,它可以提高网站的可访问性和响应速度。

  • 集成与扩展性:URL Rewrite Module 与 IIS 紧密集成,可以方便地通过 web.config 文件进行配置和管理。此外,它还支持导入其他 Web 服务器(如 Apache)的重写规则,方便迁移和集成。

示例

Url Rewite 官网 下载 URL Rewrite Module 2.1 并安装

{HTTP_REFERER} 模式为: ^http://localhost/.*$, 意思是 请求 HTTP_REFERER 必须包含 http://localhost/ 字符,规则当然是根据自己的情况写。

添加保存后,站点的 web.config 文件的 system.webServer 节点下就多了 rewrite 节点,配置如下。

	<system.webServer>
<rewrite>
<rules>
<rule name="防盗链" stopProcessing="true">
<match url=".*\.(gif|jpg|png)" />
<!--<action type="Redirect" url="http://www.baidu.com" />-->
<action type="CustomResponse" statusCode="403" subStatusCode="403" statusReason="Please do not steal my pictures" statusDescription="Please do not steal my pictures" />
<conditions>
<add input="{HTTP_REFERER}" pattern="^http://localhost/.*$" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
</system.webServer>

效果

自定义 HttpModule 处理

在 ASP.NET 中,HttpModule 是一个用于处理 HTTP 请求和响应的重要组件。通过实现 IHttpModule 接口并定义 Init 和 Dispose 方法,你可以创建自定义的 HttpModule,并在 ASP.NET 请求处理管道中的不同阶段插入自定义逻辑。

HttpModule 的主要作用包括:

  • 请求和响应处理:你可以在请求到达页面或处理程序之前或之后执行自定义代码,例如添加 HTTP 头、修改响应内容、执行身份验证或授权逻辑等。

  • 事件处理:HttpModule 可以订阅 HttpApplication 对象上的各种事件,如 BeginRequest、EndRequest、AuthenticateRequest 等,以便在请求处理的不同阶段执行代码。

  • 全局功能:由于 HttpModule 在整个 ASP.NET 应用程序中都是全局的,因此它们非常适合用于实现跨多个页面或处理程序的通用功能。

  • 性能监控和日志记录:你可以使用 HttpModule 来监控应用程序的性能,记录请求和响应的详细信息,以便进行故障排除和性能优化。

在 ASP.NET 中,HttpModule 通过订阅 HttpApplication 对象的事件来参与请求处理管道的不同阶段。这些事件允许你在请求的生命周期中的特定点执行自定义逻辑。以下是一些 HttpApplication 事件,你可以在 HttpModule 的 Init 方法中订阅它们:

  • BeginRequest:当 ASP.NET 接收到一个新的 HTTP 请求时触发。这是处理请求的最早阶段,可以在此阶段执行诸如 URL 重写、请求验证或日志记录等操作。

  • AuthenticateRequest:在 ASP.NET 对请求进行身份验证时触发。通常在此阶段使用配置的身份验证模块来确定用户的身份。

  • PostAuthenticateRequest:在身份验证过程完成后触发。可以在此阶段访问身份验证的结果或执行与身份验证相关的后处理逻辑。

  • AuthorizeRequest:在 ASP.NET 对请求进行授权时触发。在此阶段,可以基于用户的身份或其他条件确定是否允许访问请求的资源。

  • PostAuthorizeRequest:在授权过程完成后触发。可以在此阶段访问授权的结果或执行与授权相关的后处理逻辑。

  • ResolveRequestCache:在 ASP.NET 尝试从缓存中获取请求的响应时触发。如果请求的内容已经在缓存中,则可以直接从缓存中提供响应,而无需执行后续的处理程序。

  • PostResolveRequestCache:在检查缓存并确定是否使用缓存响应后触发。无论是否使用了缓存,都会触发此事件。

  • MapRequestHandler:在 ASP.NET 确定要处理请求的 HTTP 处理程序时触发。这通常涉及根据请求的 URL 和配置映射到适当的处理程序。

  • PostMapRequestHandler:在映射处理程序后触发。可以在此阶段访问选定的处理程序或执行与处理程序选择相关的后处理逻辑。

  • AcquireRequestState:在 ASP.NET 获取与当前请求关联的状态(如会话状态)时触发。这是处理与会话或应用程序状态相关的逻辑的好地方。

  • PostAcquireRequestState:在获取请求状态后触发。可以在此阶段访问请求状态或执行与状态获取相关的后处理逻辑。

  • PreRequestHandlerExecute:在 ASP.NET 开始执行选定的 HTTP 处理程序之前触发。这是准备请求数据或执行其他预处理逻辑的最后机会。

  • PostRequestHandlerExecute:在 HTTP 处理程序执行后触发。可以在此阶段访问处理程序的输出或执行与处理程序执行相关的后处理逻辑。

  • ReleaseRequestState:在 ASP.NET 释放与当前请求关联的状态时触发。这是清理与状态相关的资源的好时机。

  • PostReleaseRequestState:在释放请求状态后触发。可以在此阶段执行与状态释放相关的后处理逻辑。

  • UpdateRequestCache:如果请求的响应可以被缓存,则在发送响应到客户端之前触发。可以在此阶段将响应添加到缓存中,以便后续请求可以直接从缓存中获取。

  • EndRequest:在 ASP.NET 完成请求处理并将响应发送到客户端(或缓存)后触发。这是执行清理操作或记录请求结束时间的最后机会。

  • Error:在处理 HTTP 请求的过程中,如果出现未处理的异常,将触发此事件。可以在此阶段记录错误、执行错误处理逻辑或重定向到错误页面。

示例

修改 web.config 配置文件

	<system.webServer>
<modules>
<add name="antiTheftChainModule" type="AntiTheftChain.AntiTheftChainModule,AntiTheftChain" />
</modules>
</system.webServer>

创建实现 IHttpModule 接口的 AntiTheftChainModule 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web; namespace AntiTheftChain
{
public class AntiTheftChainModule : IHttpModule
{
public void Dispose()
{ } public void Init(HttpApplication context)
{
context.BeginRequest += Context_BeginRequest;
} private void Context_BeginRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender; var regex = new Regex(@"/[^/]+(.jpg|.bmp|.gif|.png)");
var request = context.Context.Request;
if (!regex.IsMatch(request.RawUrl)) return; if (request.UrlReferrer == null || !"127.0.0.1".Equals(request.UrlReferrer.Host))
{
context.Response.StatusCode = 403;
context.Response.StatusDescription = "(IHttpModule) Please do not steal my pictures";
context.Context.Response.End();
return;
} var fileName = context.Context.Server.MapPath(request.FilePath);
context.Context.Response.WriteFile(fileName);
}
}
}

效果

自定义 HttpHandler 处理

HttpHandler 是 ASP.NET 中的一个重要组件,负责处理 HTTP 请求。它实际上是 ISAPI 的扩展,处于 HTTP 请求处理的最底层,负责实现具体的请求响应逻辑。

当一个 HTTP 请求通过 HttpModule 容器传递到 HttpHandler 容器中时,ASP.NET Framework 会调用 HttpHandler 的 ProcessRequest 成员方法来对这个请求进行真正的处理。HttpHandler 能够处理一种或多种类型的文件或资源,其处理逻辑是通过实现 IHttpHandler 接口来定义的。

在 ASP.NET 中,创建的 ASP.NET 页面(如.aspx 文件)通常会被视为 HttpHandler,因为它们实现了 IHttpHandler 接口,并最终负责生成 HTTP 响应。然而,有时我们可能需要处理非 HTML 类型的响应,如 XML 数据或图片等,这时就可以通过自定义 HttpHandler 来实现。

自定义 HttpHandler 能够让你更灵活地控制请求的处理方式,实现更复杂的业务逻辑。例如,你可以创建一个自定义的 HttpHandler 来处理特定的文件类型,或者在处理请求之前进行身份验证和授权检查。

此外,HttpHandler 还提供了对 HTTP 请求和响应的完全控制,包括读取请求头、请求体、查询字符串等信息,以及设置响应状态码、响应头、响应体等。这使得 HttpHandler 在处理复杂的 HTTP 请求和生成自定义的 HTTP 响应时非常有用。

总的来说,HttpHandler 是 ASP.NET 中处理 HTTP 请求的核心组件,通过实现 IHttpHandler 接口并定义处理逻辑,我们可以实现对 HTTP 请求的灵活处理和自定义响应的生成。

示例

修改 web.config 配置文件

	<system.webServer>
<handlers>
<add name="antiTheftChainHandler" path="*.jpg" verb="*" type="AntiTheftChain.AntiTheftChainHandler,AntiTheftChain" />
</handlers>
</system.webServer>

创建实现 IHttpHandler 接口的 AntiTheftChainHandler 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace AntiTheftChain
{
public class AntiTheftChainHandler : IHttpHandler
{
public const string ImgHost = "127.0.0.1"; public bool IsReusable => true; public void ProcessRequest(HttpContext context)
{ var response = context.Response;
var request = context.Request; if (request.UrlReferrer == null || !ImgHost.Equals(request.UrlReferrer.Host))
{
context.Response.StatusCode = 403;
context.Response.StatusDescription = "(IHttpHandler) Please do not steal my pictures";
response.End();
return;
} var fileName = context.Server.MapPath(request.FilePath); response.WriteFile(fileName); if (request.UrlReferrer == null || ImgHost.Equals(request.UrlReferrer.Host))
{
response.WriteFile(fileName);
}
else
{
context.Response.StatusCode = 403;
context.Response.StatusDescription = "(IHttpHandler) Please do not steal my pictures";
response.End();
}
}
}
}

效果

HttpModule 和 HttpHandler 的区别

HttpModule 和 HttpHandler 在 ASP.NET 中各自扮演不同的角色,它们之间的主要区别体现在以下方面:

  • 功能和职责:

    • HttpModule:它主要作为 HTTP 请求的“必经之路”,位于请求处理管道中。HttpModule 可以在请求传递到最终的 HttpHandler 之前执行一些额外的操作,如安全检查、日志记录等。它也可以在某些条件下终止满足特定条件的请求,起到了过滤器的作用。每个 HTTP 请求都会逐一通过每个 HttpModule。
    • HttpHandler:它是页面请求的最终处理中心,负责处理具体的工作。每个请求最终都会交给 HttpHandler 的 ProcessRequest()方法进行处理。HttpHandler 针对不同类型的请求提供不同的处理方式。
  • 配置和使用:
    • HttpModule 的配置可以指定类名和命名空间,并且可以有多个,每个都可以订阅管道事件中的任意事件,以实现自定义功能。
    • HttpHandler 的配置则涉及可访问的文件、命名空间以及文件类型等。它更类似于 WebForm,可以指定访问特定页面的特定方法。
  • 作用范围:
    • HttpModule 相当于 Global,它的定义的方法会被所有的页面访问到。
    • HttpHandler 则针对每一种类型的请求只有一种处理方式,是覆盖关系。

总结来说,HttpModule 和 HttpHandler 在 ASP.NET 中协同工作,共同处理 HTTP 请求。HttpModule 作为过滤器,在请求处理之前进行预处理和条件判断;而 HttpHandler 则作为请求的最终处理中心,负责实现具体的请求响应逻辑。两者在配置、使用和作用范围上也有所不同,但共同构成了 ASP.NET 请求处理的关键部分。

Asp .Net Web Forms 系列:配置图片防盗链的几种方法的更多相关文章

  1. asp.net MVC 网站图片防盗链的几种方法

    目录 1. 通过 URL Rewrite Module 组件 2. 通过 nginx 图片防盗链 3.自定义 HttpHandler 处理 4. 通过 MVC 自定义路由规则防盗链 5. 通过 MVC ...

  2. nginx配置图片防盗链

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 30d; access_log off; valid_referers none blocked ...

  3. Nginx防盗链的3种方法 文件防盗链 图片防盗链 视频防盗链 linux防盗链

    Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品,目前Web服务器调查显示Apache下降Ngni ...

  4. Nginx防盗链的3种方法

    一:一般的防盗链如下: location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jzxue.com jzxue.c ...

  5. ASP.NET Web Forms 4.5的新特性

    作者:Parry出处:http://www.cnblogs.com/parry/ 一.强类型数据控件 在出现强类型数据控件前,我们绑定数据控件时,前台一般使用Eval或者DataBinder.Eval ...

  6. Nginx修改配置实现图片防盗链

    一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...

  7. ASP.NET Web Forms 的 DI 應用範例

    跟 ASP.NET MVC 与 Web API 比起来,在 Web Forms 应用程式中使用 Dependency Injection 要来的麻烦些.这里用一个范例来说明如何注入相依物件至 Web ...

  8. Asp.net MVC3中全局图片防盗链

    怎么样在Asp.Net MVC3中做到全局图片防盗链?如果熟悉Asp.Net的页面生命周期,相信解决这个问题应该很容易.下面就演示一下如何去做? 一.首先是全局的,我们肯定要在Global.asax文 ...

  9. ASP.NET Web API系列教程目录

    ASP.NET Web API系列教程目录 Introduction:What's This New Web API?引子:新的Web API是什么? Chapter 1: Getting Start ...

  10. ASP.NET Web API系列教程(目录)(转)

    注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP.NET Web API.这是一个用来在.NET平台上建立HTTP服务的Web API框架,是微软的又一项令人振奋的技术.目前,国内 ...

随机推荐

  1. 微信小程序-页面生命周期

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page-life-cycle.html

  2. 【3】VSCode 主题设置推荐,自定义配色方案,修改注释高亮颜色

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  3. 图解Java原理

    1:强制类型转换数据溢出 2:顺序结构的流程图 3:单if语句的流程图 4:标准if-else语句的流程图 5:扩展if-else语句的流程图 6:for循环流程图

  4. PCIe Gen 4 SSD主控大盘点:7000MB/s高速时代,到底谁能称王?

    [硬件编年史]自2006年世界上第一款搭载固态硬盘的电脑诞生之后,消费级SSD经过十几年的发展,从一开始的SATA 6Gbps SSD,到坚挺了十年的PCIe Gen 3 SSD,再到PCIe Gen ...

  5. auto_ptr|unique_ptr|shared_ptr|weak_ptr|你都搞明白了吗?

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量干货博客汇总https://blog. ...

  6. Excel如何核对同一行的两列数据是否一致

    方法一 Ctrl+G 快捷键Ctrl+G,点击[定位条件],选择"行内容差异单元格",点击[确定]. 方法二 条件格式 逆向思维,先利用条件格式查找出相同的数据,筛选剔除相同的数据 ...

  7. JS Leetcode 26. 删除有序数组中的重复项 题解分析,字典与快慢双指针

    壹 ❀ 引 本题来自LeetCode26. 删除有序数组中的重复项,是一道简单题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组 ...

  8. 微信小程序引入iconfont实现添加自定义颜色图标

    说明 最近搞微信小程序,需要添加一些图标,发现引入iconfont还是有几个步骤,就记录下来分享以下. 以下配置方法支持自定义颜色的. 操作步骤 1. 在iconfont网站挑选自己需要的图标,添加到 ...

  9. Java中的Try with Resources语句介绍

    1.介绍 从Java7诞生了try-with-resources,这家伙可以在资源使用完后实现自动关闭回收.想想我们之前打开一个文件或流对象用完咋整的,是不是finally语句块中手动close的. ...

  10. AIGC程序员效能提升之道

    得益于IT产业近几年的繁荣,老杨所在公司的业务也出奇的兴隆,每天干不完的工作背后,也意味着健康的消耗和体重的不断增加. 曾记否,刚毕业的老杨体重刚刚堪堪破百,同事们经常调侃他说是一阵风就能吹走,经过了 ...