The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

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

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

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

這次,我寫了一支 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 檔案,並設定其內容,因為我們不想讓搜尋引擎機器人來網站抓取資料,所以設定的內容如下:
    User-agent: *
    Disallow: /
  • 最後兩行,也非常關鍵,因為 robots.txt 檔案必須為 ASCII 編碼 (檔頭不能有 BOM 字元),不過 PowerShell 是一個完全以 Unicode 為主的執行環境,所以預設所有的檔案操作都會以 Unicode 編碼為主,因此我們要透過 Get-Content 取得該檔案的內容 (此時為 Unicode 編碼),然後再透過 Out-File 並指派 Encoding 參數,將檔案再回寫成系統預設編碼 (Default)。

 

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

 

之後,只要將上述程式設定好工作排程器,每天或每小時執行一次,該主機應該就算安全了!
: 通常 Google Crawler 不會一天照訪你的網站好幾次,如果要控制 Google Crawler 的造訪頻率,可以利用 Google 的網站管理員工具進行設定。

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

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

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

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

詳細內容如下:

§ 假設上述範例的指令檔位於 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

 

相關網址