配置IIS 8.5 IP地址和域限制后,允许IP访问出现404错误
一、允许IP访问出现404的原因及排查步骤
出现这种情况的核心逻辑是:被拒绝的IP在IIS的IP拦截环节就被阻断,返回403;而允许的IP通过了拦截,但后续请求资源时找不到对应内容,返回404。具体排查方向如下:
默认文档配置缺失
当允许IP直接访问站点根域名(未指定具体文件名)时,如果站点未配置正确的默认文档(比如index.html、default.aspx),或者默认文档列表中的文件在服务器上不存在,就会返回404。- 排查方法:在IIS管理器中找到站点→默认文档,检查列表中是否有实际存在的文件;或者直接访问具体存在的文件(如
http://你的域名/index.html),验证是否能正常打开。
- 排查方法:在IIS管理器中找到站点→默认文档,检查列表中是否有实际存在的文件;或者直接访问具体存在的文件(如
IP规则应用范围错误
如果允许IP的规则仅应用在站点的某个子目录/应用程序上,而非站点根级别,那么访问根目录时规则虽然允许了IP,但根目录的资源可能因其他配置(如权限、默认文档)导致404。- 排查方法:在IIS管理器中找到站点→IP地址和域限制,查看规则的"作用域"是否为站点级别。
文件/目录权限不足
IIS的匿名用户(IUSR)或IIS_IUSRS组没有站点根目录的读取权限时,会返回404(部分场景下权限不足会伪装成资源不存在)。- 排查方法:右键站点根目录→属性→安全,确认
IUSR或IIS_IUSRS组拥有读取权限。
- 排查方法:右键站点根目录→属性→安全,确认
URL重写规则冲突
如果站点配置了URL重写规则,允许IP通过后,重写规则可能将请求导向了不存在的路径,导致404。- 排查方法:在IIS管理器中找到站点→URL重写,暂时禁用所有重写规则,重新测试访问。
查看IIS日志定位具体原因
IIS日志会记录404的子状态码,能精准定位问题:- 404.0:资源确实不存在;
- 404.3:MIME类型配置错误;
- 404.13:请求内容长度超出限制等。
- 操作方法:在IIS管理器中找到站点→日志,打开日志文件,查找允许IP的访问记录,查看
sc-status和sc-substatus字段。
IP限制功能设置错误
确认IP地址和域限制的功能设置中,"访问类型"为拒绝未指定的客户端,且允许列表中的IP地址/范围填写正确(无拼写错误、子网掩码正确)。
二、其他限制IP访问的方法
1. 使用URL重写模块
安装IIS URL重写模块后,可通过web.config配置规则拦截IP:
<system.webServer> <rewrite> <rules> <!-- 拒绝指定IP范围 --> <rule name="Block Specific IPs" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{REMOTE_ADDR}" pattern="^192\.168\.1\.[0-9]+$" /> </conditions> <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Access Denied" /> </rule> <!-- 仅允许指定IP,拒绝其他 --> <rule name="Allow Only Specific IPs" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{REMOTE_ADDR}" pattern="^192\.168\.1\.100$" negate="true" /> </conditions> <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Access Denied" /> </rule> </rules> </rewrite> </system.webServer>
2. 直接编辑Web.config的ipSecurity节
这是IP限制功能的配置文件形式,需确保已安装IP and Domain Restrictions功能:
<system.webServer> <security> <ipSecurity allowUnlisted="false"> <!-- 允许单个IP --> <add allowed="true" ipAddress="192.168.1.100" /> <!-- 允许IP段 --> <add allowed="true" ipAddress="192.168.1.0" subnetMask="255.255.255.0" /> </ipSecurity> </security> </system.webServer>
3. Windows防火墙规则(网络层拦截)
在Windows Defender防火墙高级安全中创建入站规则:
- 选择端口,指定80/443端口;
- 设置阻止连接或允许连接,添加目标IP范围;
- 应用规则到域/专用/公用网络。
这种方式拦截效率更高,不会到达IIS应用层。
4. 代码层面拦截(针对ASP.NET站点)
在Global.asax的Application_BeginRequest事件中检查IP:
protected void Application_BeginRequest(object sender, EventArgs e) { // 允许的IP列表 List<string> allowedIps = new List<string> { "192.168.1.100", "192.168.1.101" }; if (!allowedIps.Contains(Request.UserHostAddress)) { Response.StatusCode = 403; Response.End(); } }
内容的提问来源于stack exchange,提问作者Som

