如何将IIS返回400错误的错误URL重定向至正确页面
错误URL重定向解决方案
问题核心是%0D属于ASCII控制字符(回车符),多数服务器会直接拦截这类请求并返回400错误,常规重写规则可能无法触发,需要针对性配置:
Apache服务器
- 先允许服务器接收含控制字符的请求,在
.htaccess或httpd.conf中添加:
AllowEncodedSlashes NoDecode AcceptPathInfo On
- 配置重定向规则:
RewriteEngine On # 仅针对该页面的重定向 RewriteRule ^my-page/%0D$ /my-page [R=301,L] # 或者通用匹配所有以%0D结尾的路径 # RewriteRule ^(.*)/%0D$ /$1 [R=301,L]
Nginx服务器
有两种处理方式:
方式1:允许请求后重写
在server块中添加配置,允许控制字符请求,再设置重写:
server { # 允许控制字符相关配置 server_name_in_redirect off; underscores_in_headers on; # 重定向规则 rewrite ^/my-page/%0D$ /my-page permanent; # 通用匹配可替换为:rewrite ^(.*)/%0D$ /$1 permanent; }
方式2:捕获400错误后跳转
如果不想修改全局请求规则,可通过错误页捕获400后判断URL跳转:
error_page 400 @handle400; location @handle400 { if ($request_uri ~* "^/my-page/%0D") { return 301 /my-page; } # 其他400错误保持原处理 return 400; }
IIS服务器
- 打开IIS管理器,进入目标站点的「请求过滤」→「编辑功能设置」,勾选「允许双重转义」并保存。
- 添加URL重写规则:
- 匹配URL模式:
^my-page/%0D$ - 操作类型:重定向
- 重定向URL:
/my-page - 状态代码:301永久重定向
- 匹配URL模式:
或者直接编辑web.config:
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> <rewrite> <rules> <rule name="Fix CR in URL" stopProcessing="true"> <match url="^my-page/%0D$" /> <action type="Redirect" url="/my-page" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer>
额外提示
- 优先使用301永久重定向,让浏览器缓存规则,减少后续错误请求。
- 测试前清除浏览器缓存,避免旧缓存干扰结果。
- 若使用CDN(如Cloudflare),可直接在CDN层配置页面规则,匹配错误URL后重定向到正确地址,无需修改源服务器配置。
内容的提问来源于stack exchange,提问作者AliAwwad
相关产品推荐
相关产品推荐

