如何用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节点等操作,仍未解决问题。
正确配置方案
核心要点
- WebSitePath必须使用WebAdministration提供程序格式,不能用物理路径。
- WebConfigProperty无法创建XML节点,需先确保
system.webServer/rewrite/rules节点存在。 - 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
错误原因解析
- WebSitePath格式错误:最初使用物理路径
c:\inetpub\wwwroot不符合WebAdministration提供要求,必须使用站点管理路径(如MACHINE/WEBROOT/APPHOST/Default Web Site或IIS:\Sites\Default Web Site)。 - 节点缺失:WebConfigProperty仅能修改已有XML节点的属性,无法创建新节点,因此必须通过Script资源提前创建
rewrite和rules节点。 - 参数配置错误:PropertyName应直接指定属性名(如
configSource),Value仅需填写属性值(如rewriterules.config),无需额外添加configSource =前缀。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

