如何使用appcmd添加IIS 8 URL重写?

时间:2015-03-05 21:33:58

标签: iis iis-8 appcmd

我想在我的服务器上自动创建一些重写规则。不幸的是,似乎所有这样做的文档已经过时了。 This is the closest I could find on SO但遗憾的是语法不再有效; appcmd抱怨给定的部分不存在。我已经想出如何处理全局规则集合,但我无法设置任何给定的属性。

这是我要插入的XML片段:

<system.webServer>
  <rewrite>
    <globalRules>
      <rule name="Strip WWW" enabled="true" stopProcessing="true">
        <match url="^(.*)$" />
        <conditions>
          <add input="{HTTP_HOST}" pattern="^www\.myapp\.com$" />
        </conditions>
        <serverVariables>
        </serverVariables>
        <action type="Redirect" url="http://myapp.com{PATH_INFO}" />
      </rule>
    </globalRules>
  </rewrite>
</system.webServer>

以下是我创建规则元素的方法。这可以正常工作:

appcmd set config -section:globalRules /+"[name='Strip WWW',enabled='true',stopProcessing='true']" /commit:apphost

我现在想创建Match URL元素,并根据上面链接的SO问题我试着猜测语法。但是,这似乎不起作用:

appcmd set config -section:globalRules/rule.[name="Strip WWW"] /match.url:"(.*)" /commit:apphost

显示以下错误消息:

  

错误(消息:未知配置部分“globalRules / rule。[name = Strip WWW]”。替换为?以获取帮助。)

我的猜测是我无法完全指定配置部分 - 除非该错误消息完全不准确。我还尝试了一些其他尝试来猜测该部分的语法:

  • globalRules / rule。[name = Strip WWW]
  • globalRules / rule [name = Strip WWW]
  • globalRules / rule [@ name = Strip WWW]

我不确定这个选择方案是什么,但它似乎不是xpath。如果我能找到所谓的内容,我可能会猜出正确的语法。

2 个答案:

答案 0 :(得分:1)

尝试使用以下语法:

appcmd set config -section:globalRules /"[name='Strip WWW']".match.url:"(*.)" /commit:apphost

我发现获取正确语法的最佳方法是在IIS,配置编辑器中进行更改,然后转到Generate Script

答案 1 :(得分:0)

我放弃了尝试用appcmd做的事情,最后用Powershell做了。我在互联网上找到的所有人都在抱怨appcmd缺少这方面的文件;我的猜测是,这已被放弃,转而采用更新,更闪亮的Powershell模块。

我找不到任何关于如何执行此操作的可靠文档,因此我编写了自己的脚本来执行此操作。以下是您如何以相当幂等的方式进行操作,适合使用PS DSC或厨师或其他任何您想要使用的自动化:

$name = "Strip WWW";
$siteName = "Default Web Site";
$url = "^(.*)$";
$redirectAction = "http://myapp.com{PATH_INFO}";
$hostPattern = "^www\.myapp\.com$";

$sitePath = "IIS:\Sites\$siteName";
$filterXpath = "/system.webserver/rewrite/rules/rule[@name='$name']";

$filter = $(Get-WebConfiguration -PSPath $sitePath -Filter $filterXpath);

if ($filter -eq $null)
{
    Add-WebConfigurationProperty -PSpath $sitePath -filter '/system.webserver/rewrite/rules' -name . -value @{name=$name; stopProcessing='True'};
    $filter = $(Get-WebConfiguration -PSPath $sitePath -Filter $filterXpath);
}

if ($filter.match.url -ne $url)
{
    Set-WebConfigurationProperty -PSPath $sitePath -filter "$filterXpath/match" -name "url" -value $url;
}

if ($filter.action.url -ne $redirectAction)
{
    Set-WebConfigurationProperty -PSPath $sitePath -filter "$filterXpath/action" -name . -value @{url=$redirectAction; type="Redirect";};
}

if ($filter.conditions.collection.count -eq 0)
{
    Add-WebConfigurationProperty -PSpath $sitePath -filter "$filterXpath/conditions" -name . -value @{input="{HTTP_HOST}"; pattern=$hostPattern};
}
else
{
    $condition = $filter.conditions.collection[0];

    if ($condition.pattern -ne $hostPattern)
    {
        Set-WebConfigurationProperty -PSPath $sitePath -filter "$filterXpath/conditions/add[1]" -name "." -value @{pattern=$hostPattern;};
    }
}