You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Desired State Configuration(DSC)配置IIS URL Rewrite?解决报错

解决DSC WebConfigProperty配置URL Rewrite规则的问题

问题回顾

在使用DSC的WebConfigProperty资源配置IIS站点的URL Rewrite规则时,遇到以下错误:

  • 初始错误:Path doesn't belong to 'WebAdministration' provider(WebSitePath格式错误)
  • 后续错误:Target configuration object 'system.WebServer/rewrite/rules' is not found(目标节点不存在)

尝试了调整WebSitePath格式、补充PropertyName参数、手动创建XML节点等操作,仍未解决问题。

正确配置方案

核心要点

  1. WebSitePath必须使用WebAdministration提供程序格式,不能用物理路径。
  2. WebConfigProperty无法创建XML节点,需先确保system.webServer/rewrite/rules节点存在。
  3. URL Rewrite模块需提前安装,否则IIS无法识别rewrite配置节点。

完整DSC配置代码

Configuration ConfigureRewriteRules {
    Import-DscResource -ModuleName WebAdministrationDsc -ModuleVersion 4.1.0
    Import-DscResource -ModuleName PSDesiredStateConfiguration

    node localhost {
        # 确保URL Rewrite 2.1模块已安装(可根据实际版本调整ProductId和下载链接)
        Package 'InstallUrlRewrite' {
            Ensure    = 'Present'
            Name      = 'URL Rewrite 2.1'
            ProductId = 'EB675D0A-5995-4386-A3D0-9DD85C3CD1F8'
            Path      = 'https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_en-US.msi'
            Arguments = '/quiet'
        }

        # 创建外部重写规则配置文件
        File 'Create_RewriteRulesFile' {
            Ensure          = 'Present'
            Type            = 'File'
            DestinationPath = 'c:\inetpub\wwwroot\rewriterules.config'
            Contents        = '<rules>
    <rule name="ExampleRedirect" stopProcessing="true">
        <match url="^old-page$" />
        <action type="Redirect" url="/new-page" redirectType="Permanent" />
    </rule>
</rules>'
            Force           = $true
            MatchSource     = $true
            DependsOn       = '[Package]InstallUrlRewrite'
        }

        # 检查并创建web.config中缺失的rewrite/rules节点
        Script 'CreateRewriteRulesNode' {
            GetScript  = {
                $webConfigPath = 'c:\inetpub\wwwroot\web.config'
                if (-not (Test-Path $webConfigPath)) { return @{ Result = 'NotFound' } }
                
                $xml = [xml](Get-Content $webConfigPath)
                $rewriteNode = $xml.configuration.SelectSingleNode('system.webServer/rewrite')
                $rulesNode = if ($rewriteNode) { $rewriteNode.SelectSingleNode('rules') } else { $null }

                return @{ Result = if ($rulesNode) { 'Present' } else { 'Missing' } }
            }
            TestScript = { (& $GetScript).Result -eq 'Present' }
            SetScript  = {
                $webConfigPath = 'c:\inetpub\wwwroot\web.config'
                $xml = [xml](Get-Content $webConfigPath)

                # 确保system.webServer节点存在
                $webServerNode = $xml.configuration.SelectSingleNode('system.webServer')
                if (-not $webServerNode) {
                    $webServerNode = $xml.configuration.AppendChild($xml.CreateElement('system.webServer'))
                }

                # 确保rewrite节点存在
                $rewriteNode = $webServerNode.SelectSingleNode('rewrite')
                if (-not $rewriteNode) {
                    $rewriteNode = $webServerNode.AppendChild($xml.CreateElement('rewrite'))
                }

                # 确保rules节点存在
                if (-not $rewriteNode.SelectSingleNode('rules')) {
                    $rewriteNode.AppendChild($xml.CreateElement('rules'))
                }

                $xml.Save($webConfigPath)
            }
            DependsOn   = '[File]Create_RewriteRulesFile'
        }

        # 配置rules节点的configSource属性
        WebConfigProperty 'SetRulesConfigSource' {
            Ensure       = 'Present'
            WebSitePath  = 'MACHINE/WEBROOT/APPHOST/Default Web Site'
            Filter       = 'system.webServer/rewrite/rules'
            PropertyName = 'configSource'
            Value        = 'rewriterules.config'
            DependsOn    = '[Script]CreateRewriteRulesNode'
        }
    }
}

# 生成并执行配置
ConfigureRewriteRules
Start-DscConfiguration -Path .\ConfigureRewriteRules -Wait -Verbose -Force

错误原因解析

  1. WebSitePath格式错误:最初使用物理路径c:\inetpub\wwwroot不符合WebAdministration提供要求,必须使用站点管理路径(如MACHINE/WEBROOT/APPHOST/Default Web Site或IIS:\Sites\Default Web Site)。
  2. 节点缺失:WebConfigProperty仅能修改已有XML节点的属性,无法创建新节点,因此必须通过Script资源提前创建rewrite和rules节点。
  3. 参数配置错误:PropertyName应直接指定属性名(如configSource),Value仅需填写属性值(如rewriterules.config),无需额外添加configSource =前缀。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:34:50