IIS问题解决:URL中制表符引起的Bad Request - Invalid URL

昨天处理好了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

时间: 2024-11-05 00:28:53

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

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

摘要 本文档定义了在WWW浏览器的URL中执行的文本IPv6地址的格式.在包括Microsoft的IE,Mozilla和Lynx等几个已经被广泛安装使用的浏览器的IPv6版本中,这种格式已经被使用.并且这种格式也将被应用于服务定位协议的IPv6版本中.本文档包括了一个对在RFC2396[URL]被定义的统一资源标识符中的一般性语法的更新.为了这个预定目标,本文档明确定义了IPv6地址的语法规则并允许在统一资源标识符中使用"["和"]"符号. 1.介绍 在[ARCH]

JS获取URL中参数值(QueryString)的4种方法

在某书上看到这道题目,查找解题思路后做了部分解析,如有错误请指正 方法一:正则法 代码如下: function getQueryString(name) {    var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); //匹配指定name的QueryString    var r = window.location.search.substr(1).match(reg); //window.location.sea

URL中的特殊字符

原网址:http://pichcar.iteye.com/blog/676292 URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 空格的编码值是"%20". 下表中列出了一些URL特殊符号及编码 :替换为%3A 十六进制值 1. +  URL 中+号表示空格 %2B 2. 空格 URL中的空格可以用+号或者编码 %2

URL中的特殊字符处理

URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 空格的编码值是"%20".下表中列出了一些URL特殊符号及编码:替换为%3A 十六进制值 1. + URL 中+号表示空格 %2B 2. 空格 URL中的空格可以用+号或者编码 %20 3. / 分隔目录和子目录 %2F 4. ? 分隔实际的 URL 和参数 %3F 5

URL中的特殊字符处理笔记

URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 空格的编码值是"%20". 下表中列出了一些URL特殊符号及编码 :替换为%3A 十六进制值 1. +  URL 中+号表示空格 %2B 2. 空格 URL中的空格可以用+号或者编码 %20 3. /  分隔目录和子目录 %2F 4. ?  分隔实际的 URL 和参数

获取URL中的参数值

//获取url中ID的值function getParamByName(name, url) { var match = RegExp('[?&]' + name + '=([^&]*)').exec(url); return match && decodeURIComponent(match[1].replace(/\+/g, ' ').replace('#', '')); }  var ID = getParamByName("memberid",

wordpress如何去除URL中的category

WordPress网站url一般默认有Category,既不利于优化也不利于用户体验,如何去除,韶关SEO博客推荐2种比较简单的方法. 第一种:更改固定链接. 1.登录wordpress后台,点击设置里面的固定连接. 2.在"可选"下的"分类目录前缀"框中填写英文的".",保存更改后,就能去掉Category了. 3.上面步骤完成后页面还是无法打开或出现404错误,可能是与你做的固定链接设置中常用设置有关,如果出现这个情况只需要在自定义结构里面加

JAVA从url中分离ip和port

public class NetAddrUtil { /** * 从url中分析出hostIP<br/> * @param url * @author wull * @return */ public static String getIpFromUrl(String url) { // 1.判断是否为空 if (url == null || url.trim().equals("")) { return ""; } // 2. 如果是以localhos

URL中包含有特殊字符,进行转义

String temp = URLEncoder.encode(json); URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 空格的编码值是"%20". 下表中列出了一些URL特殊符号及编码 :替换为%3A 十六进制值 1. +  URL 中+号表示空格 %2B 2. 空格 URL中的空格可以用+号或者编码 %20