zoukankan      html  css  js  c++  java
  • IIS问题解决:URL中制表符引起的Bad Request

    昨天处理好了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_MACHINESystemCurrentControlSetServicesHTTPParameters
    • 添加键值: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 

  • 相关阅读:
    C++——overloading
    C++——调用优化
    C++——Big Three(copy ctor、copy op=、dtor)
    C++——引用 reference
    C++——构造函数 constructor
    003——矩阵的掩膜操作
    002——加载、修改、保存图像
    001——搭建OpenCV实验环境
    宏——基础
    剖析可执行文件ELF组成
  • 原文地址:https://www.cnblogs.com/dudu/p/iis-400-bad-request-invalid-url.html
Copyright © 2011-2022 走看看