我想在我的服务器上自动创建一些重写规则。不幸的是,似乎所有这样做的文档已经过时了。 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]”。替换为?以获取帮助。)
我的猜测是我无法完全指定配置部分 - 除非该错误消息完全不准确。我还尝试了一些其他尝试来猜测该部分的语法:
我不确定这个选择方案是什么,但它似乎不是xpath。如果我能找到所谓的内容,我可能会猜出正确的语法。
答案 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;};
}
}