昨天处理好了Google网站管理员中的500错误,今天处理了一些400处理,比如下面的以制表符(tab)结尾的URL:

http://www.cnblogs.com/me-sa/archive/2008/05/16/1200329.html%09
http://www.cnblogs.com/JimmyZhang/archive/2007/12/20/1006555.html%09
...

访问这些URL时,IIS会返回400 bad request的错误:

Bad Request - Invalid URL


HTTP Error 400. The request URL is invalid.

这个错误页面是由IIS的底层http.sys直接返回的,既不能自定义错误页面,也不能进行URL重写。而我们想要的结果是访问这样的URL时,能自动跳转至正确的URL(去掉结尾的制表符)。

于是想借助IIS URL Rewrite Module来实现,但现在请求直接被http.sys在底层拦截了,根本到达不了URL Rewrite Module。还好,可以通过注册表设置让http.sys不拦截这样的URL。

注册表设置方法如下:

  • regedit打开注册表编辑器,进入HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters
  • 添加键值:AllowRestrictedChars REG_DWORD 1 (默认为0,会拦截\x00-\x1F与\x7F-\x9F的字符,制表符的ASCII码是\x09)
  • 重启http.sys与IIS,使注册表的设置生效:
net stop http
net start http
iisreset

这样设置之后,URL中包含制表符的请求就能到达IIS URL Rewrite Module,然后用一条URL重写规则进行重定向跳转。结果却发现根本不起作用,没进行跳转,依然是400错误,只不过现在是由ASP.NET返回的。

HTTP Error 400.0 - Bad Request

ASP.NET detected invalid characters in the URL.

这估计是URL Rewrite Module的一个小bug。

后来采用了一个折衷的解决方法,不进行重定向跳转,只进行URL重写,这样虽然URL不对,但至少页面可以正常访问。

于是最终采用了下面的URL重写规则折衷地解决了问题:

<rule name="endwith_tab" stopProcessing="true">
<match url="^([^.]+\.(?:html|aspx))[\x09]" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="{R:1}" appendQueryString="false" />
</rule>

【参考资料】

Http.sys registry settings for Windows

Use of special characters like '%' ‘.’ and ‘:’ in an IIS URL

IIS问题解决:URL中制表符引起的Bad Request - Invalid URL的更多相关文章

  1. SpringMVC(三):@RequestMapping中的URL中设定通配符,可以使用@PathVariable映射URL绑定的占位符

    1)带占位符的URL是Spring3.0新增的功能,该功能在SpringMVC向REST目标挺进发展过程中具有里程碑的意义. 2)通过@PathVariable可以将URL中占位符参数绑定到控制器处理 ...

  2. ipv6地址在URL中的表达方式,如何在URL地址中包含ipv6地址

    摘要 本文档定义了在WWW浏览器的URL中执行的文本IPv6地址的格式.在包括Microsoft的IE,Mozilla和Lynx等几个已经被广泛安装使用的浏览器的IPv6版本中,这种格式已经被使用.并 ...

  3. URL中的保留和不安全字符

    书写URL时要使用US-ASCII字符集可以显示的字符. http://www.google.com 如果需要在URL中使用不属于此字符集的字符,就要使用特殊的符号对该字符进行编码. 如:最常使用的空 ...

  4. URL中的特殊字符

    原网址:http://pichcar.iteye.com/blog/676292 URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编 ...

  5. js获取url中参数

      /** * 获取地址栏参数值 * @param name 参数名 * @returns */ $(function () { var url = location.search; //获取url中 ...

  6. JS获取URL中参数值(QueryString)的4种方法分享<转>

    方法一:正则法 复制代码代码如下: function getQueryString(name) {    var reg = new RegExp('(^|&)' + name + '=([^ ...

  7. URL中的特殊字符处理笔记

      URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII ...

  8. 获取URL中的参数值

    //获取url中ID的值function getParamByName(name, url) { var match = RegExp('[?&]' + name + '=([^&]* ...

  9. 关于一些url中传递参数有空格问题

    1.关于一些url中传递参数有空格问题: url.replace(/ /g, "%20") 从上面的例子中可以看到可以用:replace(/ /g, "%20" ...

随机推荐

  1. sqlserver 加内置dll的使用内存

  2. DHCP服务器的开始方式

    方法一:采用DHCP服务器接口开启的方式 [Huawei]dhcp enable [Huawei]int g0/0/0[Huawei-GigabitEthernet0/0/0]ip add 192.1 ...

  3. 编程范式 epesode7,8 stack存放指针类型and heap,register

    这一节从后往前写. ____stack and heap ___stack由 汇编语言操控管理,数据先入后出. 栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变 ...

  4. PHP生成静态页

    代码如下: <?    function makedir($mudir) //创建目录   {   $file = "./$mudir";   @mkdir($file,07 ...

  5. oc中的枚举定义

    typedef NS_ENUM(类型,枚举名){        枚举名+值名,       枚举名+值名,}; 该方法定义的枚举,OC会自动把其转换成合适当前版本的枚举.如果枚举值可合并的话 NS_E ...

  6. [原创]HEXO博客搭建日记

    博客系统折腾了好久,使用过Wordpress,Ghost,Typecho,其中Typecho是我使用起来最舒心的一种,Markdown编辑+轻量化设计,功能不多不少刚好,着实让我这种强迫症患者舒服了好 ...

  7. C#版SQLHelper.cs类

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...

  8. iframe跨域访问

    js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决 ...

  9. javascript 的 clientX用法

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  10. 选择合适的String拼接方法(这篇博客是我抄的)

    package com.test; public class FreeFile { public static void main(String[] args) { // 加号拼接 String st ...