如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理

本文介绍在 iis 中托管 asp.net 6 应用时,如何通过 web.config 配置排除 `/blog` 等子目录,使其绕过 aspnetcoremodulev2,转而由已注册的 php 处理器(如 fastcgi)接管请求。

在混合技术栈部署场景中(例如主站使用 ASP.NET 6,博客子目录使用 PHP),关键挑战在于 IIS 默认会将所有请求(包括子目录)统一交由 aspNetCore 处理器处理。若不显式干预,PHP 文件(如 /blog/index.php)将被 ASP.NET 拦截并返回 404 或错误响应。解决思路是:在 IIS 配置层面,针对特定路径移除 ASP.NET Core 处理器注册,从而让请求自然回落至其他匹配的 handler(如 PHP 的 PhpFastCgi)

实现该目标最可靠、推荐的方式是利用 IIS 的 配置节结合 指令。 明确作用于 /blog 路径及其子路径,并在其作用域内移除名为 aspNetCore 的处理器。此时,IIS 将跳过 ASP.NET Core 模块,转而根据文件扩展名(如 .php)和已配置的 PHP handler(需提前在 IIS 中安装并注册 PHP via FastCGI)进行后续处理。

以下为完整、可直接使用的 web.config 示例(置于站点根目录):



  
  
    
      
        
      
      
    
  

  
  
    
      
        
      
    
  

关键说明与注意事项:

  • 中的 path 值为相对 URL 路径(非物理路径),且不带前导 /;IIS 会自动匹配 /blog/xxx 所有子请求。
  • 必须精确匹配 中定义的处理器名称(区分大小写),确保移除成功。可通过 IIS 管理器 → 站点 → “处理程序映射” 验证名称。
  • 此配置要求 PHP 已在 IIS 中正确安装并配置为 FastCGI 应用池(推荐使用 PHP Manager for IIS 或手动注册 php-cgi.exe)。未配置 PHP handler 时,移除 aspNetCore 后请求将返回 HTTP 404 或 500 错误。
  • 替代方案:在 /blog 目录下单独放置一个 web.config,仅包含 。但该方式在嵌套子应用或权限受限环境中可能受 allowOverride 策略影响,主配置中统一管理更可控。
  • 修改后务必重启 IIS 应用池或执行 iisreset /noforce,确保配置生效。

通过以上配置,即可安全实现 ASP.NET 6 与 PHP 在同一 IIS 站点下的共存与路径级路由隔离,兼顾开发灵活性与生产稳定性。