一起谈.NET技术,获取ISAPI_Rewrite重写后的URL

简介:   ISAPI_Rewrite是一个较为好用的URL重写组件,安装和配置都比较简单,防盗链的设置也极其简单。  问题  如何获取被ISAPI_Rewrite重写后的URL。  测试环境:IIS6中使用ISAPI_Rewrite对Default.aspx进行重写,重写后的地址为:Index-After-ReWriter.html。

  ISAPI_Rewrite是一个较为好用的URL重写组件,安装和配置都比较简单,防盗链的设置也极其简单。

  问题

  如何获取被ISAPI_Rewrite重写后的URL。

  测试环境:IIS6中使用ISAPI_Rewrite对Default.aspx进行重写,重写后的地址为:Index-After-ReWriter.html。

  需要获取重写后的地址,即Index-After-ReWriter.html。

  一些弯路

  首先想到的就是Request对象,如Request.UrlRequest.RawUrl。测试后发现获取到的地址都是Default.aspx。上网找了找ISAPI_Rewrite的处理流程图,找到了下面这个图片。

  那么再来看下IIS处理aspx页面的流程图。

  在提交到ASP.NET模块处理前,同样都是ISAPI扩展的aspnet_isapi.dll和ISAPI_Rewrite.dll,从第一张图中可以看出ISAPI_Rewrite.dll解析了重写后的URL(即测试环境中的Index-After-ReWriter.html),即解析成Default.aspx后再转由aspnet_isapi.dll进行处理。真的是这样吗?去IIS中去一看便知。

  注意是在IIS中的网站全局属性中查看,如果需要使重写模块对单一的网站起作用那么需要单独对网站进行设置。那么在Request对象中还会保存有重写后的URL地址吗?

  又上网找了找,正如博文当你的博客文章的作者变成“编辑整理”,你作何感想?中提到的一样,带来的一个现象是点了前两页获取到的信息的都是这篇文章: 使用Request.RawUrl获取当前请求重写(UrlRewrite)后的Url

  我基本保持文章中提供的源代码测试了下。

protected   override   void  OnInit(EventArgs e)
{
    
string  a  =  Request.ServerVariables[ " SCRIPT_NAME " ];
    
// string b = Request.ServerVariables["QUERY_STRING"];
    
// string c = Request.Url.AbsoluteUri;
    
// string d = Request.ServerVariables["HTTP_URL"];
     string  f  =  Request.Url.ToString();
    
base .OnInit(e);
}

  调试了下,发现不管怎么获取,得到的值还是Default.aspx。不过提供的源代码中那三段莫名其妙的注释提醒了我, 因为ISAPI_Rewrite这个组件是从Apache mod_rewrite移植过来的,那么PHP等其他语言应该有类似的通用方法,说的时髦点就是跨平台的方法去获取重写后的URL地址。

  解决方法

   继续去查,发现的确是这样。

  “在修改URL之前ISAPI_Rewrite会保存原URL到Http头,命名为X-Rewrite-URL。然后它能够在脚本中作为HTTP_X_REWRITE_URL服务器变量取回。因为在IIS里,系统变量名不能被修改,所以ISAPI_Rewrite不能提供与Apache兼容的变量名REQUEST_URI。如果你的应用程序的设计要依赖于REQUEST_URI变量,你必须修改它,用HTTP_X_REWRITE_URL变量来代替。”

  使用抓包工具Fiddler抓包或者加断点查看Request.ServerVariables的值。

  发现HTTP_X_REWRITE_URL中保存了重写前的URL地址。可以这样测试一下。

protected   void  Page_Load( object  sender, EventArgs e)
{
    
if  (Request.ServerVariables[ " HTTP_X_REWRITE_URL " ==   null return ;
    Response.Write(Request.ServerVariables[
" HTTP_X_REWRITE_URL " ]);
    Response.End();
}

   结果是这样:

  文中有些臆断之处,还望各位大虾不吝赐教! 

目录
相关文章
|
29天前
|
人工智能 前端开发 开发工具
解读.NET 技术的开发潜力
本文全面介绍了.NET技术在软件开发领域的核心优势、创新应用及面临的挑战。.NET以其统一的开发平台、强大的工具和跨平台能力,成为企业级应用、Web应用乃至游戏开发的理想选择。然而,在性能优化、容器化及AI集成等方面仍需不断突破。通过积极拥抱开源和社区驱动模式,.NET将持续推动软件开发的进步。
47 1
|
1月前
|
监控 网络协议 API
.NET WebSocket 技术深入解析,你学会了吗?
【9月更文挑战第4天】WebSocket 作为一种全双工协议,凭借低延迟和高性能特点,成为实时应用的首选技术。.NET 框架提供了强大的 WebSocket 支持,使实时通信变得简单。本文介绍 WebSocket 的基本概念、.NET 中的使用方法及编程模型,并探讨其在实时聊天、监控、在线游戏和协同编辑等场景的应用,同时分享最佳实践,帮助开发者构建高效实时应用。
93 12
|
1月前
|
人工智能 前端开发 Devops
.NET技术自发布以来,在软件开发领域发挥了重要作用
【9月更文挑战第12天】.NET技术自发布以来,在软件开发领域发挥了重要作用。本文分为三部分探讨其在现代开发中的应用:首先介绍.NET的核心价值,包括语言多样性、强大的开发工具支持、丰富的类库、跨平台能力和活跃的社区;接着分析其在企业级应用、Web开发、移动应用、云服务及游戏开发中的实际应用;最后讨论.NET面临的挑战与未来趋势,如性能优化、容器化、AI集成及跨平台框架竞争等。通过不断的技术创新和社区驱动,.NET将持续推动软件开发的进步。
32 4
|
1月前
|
人工智能 开发框架 算法
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
|
1月前
|
传感器 应用服务中间件 Linux
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
|
1月前
|
人工智能 算法 C#
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
|
2月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
33 0
|
1月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
32 7
|
1月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
42 0
|
2月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
38 0