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

  问题

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

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

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

  一些弯路

  首先想到的就是Request对象,如Request.Url和Request.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();
}

   结果是这样:

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

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162666.html

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

  1. 获取ISAPI_Rewrite重写后的URL

    ISAPI_Rewrite是一个较为好用的URL重写组件,安装和配置都比较简单,防盗链的设置也极其简单. 问题 如何获取被ISAPI_Rewrite重写后的URL. 测试环境:IIS6中使用ISAPI ...

  2. php获取跳转后url,php获取跳转后真实url的方法

    php获取跳转后真实url的方法 发布时间:2020-08-01 14:17:56 来源:亿速云 阅读:68 作者:清晨 这篇文章主要介绍php获取跳转后真实url的方法,文中介绍的非常详细,具有一定 ...

  3. java 怎么做302重定向_利用Java怎么获取302重定向后的URL

    利用Java怎么获取302重定向后的URL 发布时间:2021-01-22 16:59:02 来源:亿速云 阅读:57 作者:Leah 本篇文章为大家展示了利用Java怎么获取302重定向后的URL, ...

  4. php 判断 跳转url参数,怎么通过链接获取跳转后的url参数

    本帖最后由 bing15 于 2014-09-12 14:27:23 编辑 我有一个链接,https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?ui ...

  5. 使用curl获取Location:重定向后url

    在php获取http头部信息上,php有个自带的函数get_headers(),我以前也是用这个的,听说效率在win上不咋地,再加上最近研究百度url无果,写了cURL获取重定向url的php代码来折 ...

  6. jquery 判断 重定向url_使用curl获取Location:重定向后url

    在php获取http头部信息上,php有个自带的函数get_headers(),我以前也是用这个的,听说效率在win上不咋地,再加上最近研究百度url无果,写了cURL获取重定向url的php代码来折 ...

  7. URL重写后,在有页面回发时的处理

    在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11. ...

  8. URL 重写就是把URL地址重新改写

    作者:overred   来源:原创 URL 重写就是把URL地址重新改写(汗^_^). 详情:http://www.microsoft.com/china/msdn/library/webservi ...

  9. URL 重写就是把URL地址重新改写(汗^_^)。

    URL 重写就是把URL地址重新改写(汗^_^).详情:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewri ...

最新文章

  1. html5考试总结300字,期中考心得300字5
  2. cout 数组_C语言学习笔记(十)二维数组内存预设
  3. ssh客户端避免超时的设置
  4. 皮一皮:有钱人的世界咱不懂...
  5. gitlab的日常使用
  6. Matlab——数值计算——单个代数方程 代数方程组
  7. linux执行jar包命令没有主清单熟悉,jar命令成功完成 java -jar 命令却提示“没有主清单属性”!...
  8. 什么是openstack_您在OpenStack Summit 2016上错过了什么
  9. java多线程nullpointerexception_温故而知新!越是基础越容易被忽略,java最全基础知识,附赠资料...
  10. makefile:5: *** missing separator. Stop.
  11. PacMan开发-碰撞检测实现
  12. IDEA+Maven搭建JavaWeb项目
  13. 安卓内存监控悬浮窗,6年菜鸟开发面试字节跳动安卓研发岗,面试建议
  14. part 8 App电量优化
  15. trans系列是sci几区_怎么确定SCI是几区的?
  16. qq传输文件为什么服务器忙,win10系统qq接收文件慢一直显示传输连接中的教程
  17. 雷军与小米:上扬的微笑与下行的隐忧
  18. http://stormzhang.com/devtools/2014/12/09/android-studio-tutorial3/ 安卓studio 安装教程
  19. [轻音乐] - 班得瑞专辑[14CD]
  20. python将object转换为float_object怎么转换成float数据

热门文章

  1. atitit.跨语言实现备份mysql数据库 为sql文件特性 api 兼容性java c#.net php js
  2. 【微软公有云系列】Hyper-v(WinSer 2012 R2)网络虚拟化(三)租户隔离
  3. 路由过滤之 Route-map Distribute-list
  4. 5G LAN — 解决方案示例
  5. QEMU — 编译安装指定的版本
  6. 5G NGC — GTPv1-U 协议的扩展
  7. Socket 网络编程实践经验
  8. Linux dmesg命令
  9. 编程进阶,学会使用_I、_O、_IO,以及volatile const的意义
  10. mysql字符串操作