powershell で X-AspNet-Version ヘッダを削除する

サーバ全体で無効化する方法がないか調べてみたところ msdn ブログがヒットしました。

[Remove Unwanted HTTP Response Headers](http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx)

方法は 2 種類あって、web.config に追加する方法と、サーバレベルでサーバ変数を利用した rewrite を行う方法があるようです。  
ただし、後者は  `ヘッダそのものではなく、ヘッダの値を隠蔽` するというものになっています。  

# web.config での方法

以下の 3 行をトップレベルの web.config に追記します。

```
  <system.web>
      <httpRuntime enableVersionHeader="false" />
  </system.web>
```

または下記コマンドを実行します。

```
c:\windows\system32\inetsrv\appcmd.exe set config -section:system.web/httpRuntime -enableVersionHeader:false /commit:webroot /clr:4
```

.NET2 の場合は `/clr:2` とします。  
すると ROOT である `C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Web.config`  に上記内容が追加されます。

IISフォーラム先生ありがとうございます。
[System.Web in Applicationhost.config not working anymore (IIS8.5)](http://forums.iis.net/t/1219263.aspx?System+Web+in+Applicationhost+config+not+working+anymore+IIS8+5)

# applicationHost.config での方法

IIS 8 からは applicationHost.config での system.web セクションは廃止されたとのこと。

# rewrite での方法

> Please note that it will not remove the header all together but it will remove the value of it.  

あまり意味はなさそうですが、とりあえずやってみようということで、サイト内の手順に沿って IIS マネージャから設定したところ、 `applicationHost.config` に設定が追加されてしまいました。

``` xml
    <system.webServer>
        <rewrite>
            <allowedServerVariables>
                <add name="RESPONSE_X-ASPNET-VERSION" />
            </allowedServerVariables>
            <outboundRules>
                <rule name="RESPONSE_X-ASPNET-VERSION">
                    <match serverVariable="RESPONSE_X-ASPNET-VERSION" pattern=".+" />
                    <action type="Rewrite" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
```

powershell でできないか調べてみたところ、いくつかのコマンドレットを使うとよさそうです。

[Get-WebConfigurationProperty](https://technet.microsoft.com/ja-jp/library/ee790590.aspx) 
[Add-WebConfigurationProperty](https://technet.microsoft.com/en-us/library/hh867838(v=wps.630).aspx) 
[Set-WebConfiguration](https://technet.microsoft.com/ja-jp/library/ee807820.aspx:title)

スクリプトは以下のようになりました。

``` ps1
# add allowedServerVariables
$asv = Get-WebConfigurationProperty `
       -filter "//rewrite/allowedServerVariables/add"`
       -name name

if ($asv -eq $null)
{
  Add-WebConfigurationProperty `
    -Filter "//rewrite/allowedServerVariables" `
    -PSPath "IIS:\" `
    -Name "Collection" `
    -Value @{name="RESPONSE_X-ASPNET-VERSION"}
}

# add rule
$rule = Get-WebConfigurationProperty `
          -filter "//rewrite/outboundRules/rule[@name='REMOVE_X-ASPNET-VERSION']/match"`
          -name serverVariable

if ($rule -eq $null)
{
  Add-WebConfigurationProperty `
    -Filter "//rewrite/outboundRules" `
    -PSPath "IIS:\" `
    -Name "Collection" `
    -Value @{name="REMOVE_X-ASPNET-VERSION"}

  Set-WebConfiguration `
    -Filter "//rewrite/outboundRules/rule[@name='REMOVE_X-ASPNET-VERSION']/match" `
    -PSPath "IIS:\" `
    -Value @{serverVariable="RESPONSE_X-ASPNET-VERSION";pattern=".+"}
  
  Set-WebConfiguration `
    -Filter "//rewrite/outboundRules/rule[@name='REMOVE_X-ASPNET-VERSION']/action" `
    -PSPath "IIS:\" `
    -Value @{type="Rewrite"}
}
```

画像のようにバージョンが空になります。

![Screen Shot 2015-10-27 at 16.19.21.png](https://qiita-image-store.s3.amazonaws.com/0/11541/f396aa43-b92f-41b8-02f3-bc525052d9d7.png)