﻿# 使用 PowerShell 在 IIS7 / IIS8 所有站台新增 robots.txt 檔案

還記得我去年寫過的【[個資保護、Google Hacking 與 robots.txt 的關係與設定技巧](/post/2012/04/18/Google-Hacking-and-the-robots-txt-file.aspx)】文章嗎？在公司內部的測試環境設定 **robots.txt** 非常重要，因為你必須阻止 Google 與各家搜尋引擎來到你的測試網站大肆搜索，否則那些開發到一半的網站、那些可能含有不完整的資訊，全部都會揭露給無心人與有心人知道。不過，無論我提過幾次這點重要性，總是有人會「忘記」在部署網站時順手加上這個檔案，三不五時的亡羊補牢其實也蠻讓人頭疼的，今天我寫了一支 PowerShell 指令檔，就是要來徹底解決這個問題。

首先，我們測試機網站超多，再過沒多久網站就要上百個了，如果有幾個網站沒加上，也只是剛剛好而已，但只要一個網站出問題就很難看啦。不過，網站這麼多，一個一個手動加上 robots.txt 會不會太辛苦，難道要花錢請工讀生每天查看一次所有網站的根目錄嗎？這成本也太高了些！所以，能有個自動化的管理機制，能夠避免人為疏失，才是比較務實的做法，此時，就必須寫一點小程式來解決啦！  
(**備註**: 文末有提供 3 個贊助方案，程式碼請放心 Copy 回家用，對你有幫助再贊助即可，別有心理壓力! )

這次，我寫了一支 PowerShell 指令檔，該指令檔雖然短短的，但有許多細節要注意，我們先來看看程式碼，再來看解說：

```powershell
Import-Module WebAdministration
 
Get-Website | Where-Object {
    $_.State -eq 'Started' -and $_.PhysicalPath -notlike "*%*"
} | ForEach-Object {
    cd $_.PhysicalPath
    if($?) {
        echo 'User-agent: *' > robots.txt
        echo 'Disallow: /' >> robots.txt
        $txt = Get-Content 'robots.txt'
        $txt | Out-File -Encoding Default 'robots.txt'
    }
}
```

程式碼解說：

-   Import-Module WebAdministration 先匯入 IIS 管理指令的 PowerShell 模組 (WebAdministration)
-   Get-Website 將目前 IIS 站台中所有網站列出
-   Where-Object 設定一些條件過濾掉不適合的網站

-   我們僅設定**已啟動**的網站
-   有時候預設網站會設定**環境變數** (例如: **%SystemDrive%**)，該變數在 PowerShell 中無法辨識，所以要予以排除！

-   ForEach-Object 讓篩選出來的 IIS 網站進入一個迴圈執行
-   cd $\_.PhysicalPath 進入該網站實體路徑的目錄
-   **$?** 是 PowerShell 中會回傳上一個指令的執行結果，只要是 False 就代表無法進入該路徑 (重要)
-   接著這 2 行 echo 指令，會建立 **robots.txt** 檔案，並設定其內容，因為我們不想讓搜尋引擎機器人來網站抓取資料，所以設定的內容如下：
    
    ```yaml
    User-agent: *
    Disallow: /
    ```
    
-   最後兩行，也非常關鍵，因為 **robots.txt** 檔案必須為 ASCII 編碼 (檔頭不能有 [BOM](http://en.wikipedia.org/wiki/Byte_order_mark) 字元)，不過 PowerShell 是一個完全以 Unicode 為主的執行環境，所以預設所有的檔案操作都會以 Unicode 編碼為主，因此我們要透過 Get-Content 取得該檔案的內容 (此時為 Unicode 編碼)，然後再透過 Out-File 並指派 Encoding 參數，將檔案再回寫成系統預設編碼 (Default)。

**【特別注意】  
**請立刻檢查你家網站的 **robots.txt** 檔案，如果該檔案為 **UTF-8 with BOM** 編碼，將會因為 [BOM](http://en.wikipedia.org/wiki/Byte_order_mark) 字元而讓該檔案失效，你會以為已經正確設定了，不過卻沒有任何作用，這點比需特別注意。尤其是習慣在 **Visual Studio** 中新增 **文字檔案** (\*.txt) 的開發人員，更應該特別注意這點。

之後，只要將上述程式設定好工作排程器，每天或每小時執行一次，該主機應該就算安全了！  
**註**: 通常 Google Crawler 不會一天照訪你的網站好幾次，如果要控制 Google Crawler 的造訪頻率，可以利用 Google 的[網站管理員](http://www.google.com/intl/zh-TW/webmasters/)工具進行設定。

不過，在 Windows 的工作排程器設定有些地方必須注意：

1\. 由於使用 WebAdministration 模組裡的 Cmdlets 必須「**以最高權限執行**」，否則會導致權限不足而無法正確執行

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0ee397ff2261073afdc5-image_2020.png)

2\. **觸發程序**部分可以設定多久執行一次

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/60b911d453d854f53d59-image_2021.png)

3\. **動作**部分，也必須設定正確才能執行，我們要透過 powershell.exe 來啟動這個 Script 檔，範例如下：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7fdba55ec0bfddfd6a1a-image_2022.png)

詳細內容如下：

§ 假設上述範例的指令檔位於 C:\\Users\\Administrator\\Desktop\\Inject\_robots.txt\_to\_Sites.ps1

-   程式或指令碼：C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe
-   新增引數：\-Command .\\Inject\_robots.txt\_to\_Sites.ps1
-   開始位置：C:\\Users\\Administrator\\Desktop

**相關網址**

-   [Web Server (IIS) Administration Cmdlets in Windows PowerShell](http://technet.microsoft.com/en-us/library/ee790599.aspx)
-   [Using the Where-Object Cmdlet](http://technet.microsoft.com/en-us/library/ee177028.aspx)
-   [PowerShell Error Handling and Why You Should Care](http://blogs.technet.com/b/heyscriptingguy/archive/2011/05/12/powershell-error-handling-and-why-you-should-care.aspx)
-   [robots.txt - 維基百科，自由的百科全書](https://zh.wikipedia.org/wiki/Robots.txt)
-   [Rex Swain's HTTP Viewer](http://www.rexswain.com/httpview.html) ( 可以查出你目前網站的 robots.txt 是否含有 BOM 字元 )
-   [Make Sure Your Robots.txt File is UTF-8](http://www.seroundtable.com/archives/017801.html)
