還記得我去年寫過的【個資保護、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
相關網址