今天是最後一天寫扣了,前幾天已經把功能都做完,今天只修一些部署會用到的小地方
之前在 Day10-替換頁面中的網址 中有把兩個變數抽出來:upstreamURL 是 Github 網址、phishURL 是我們釣魚網站的網址,要取代 HTML 網址時就直接用這兩個變數把 upstreamURL 取代成 phishURL,這樣使用者就不會被倒回真正的 Github
const (
    upstreamURL = "https://github.com"
    phishURL    = "http://localhost:8080"
)
但現在有個問題,因為上線後網址會變成 https://phish-github.com,不再是原本的 localhost,所以必須把 phishURL 改成上線後的網址,這邊我想到兩個解決方法:
直接把扣改成 const phishURL = "https://phish-github.com",這種方法叫做 hard code,是最不用動腦的方法,改完就可以部署上去了,但這樣有個副作用就是開發時你就要再改回 http://localhost:8080,一直改來改去
第二個方法是從 command line 設定參數讓使用者把 phishURL 傳進來,用起來像 go run main.go --phishURL=https://phish-github.com,同一份扣可以開發也可以部署不用再改來改去,可配置程度高很多
這邊選用第二種方法,在 Go 裡面要讀取 command line 參數可以使用 flag,他是官方提供用來處理參數的 package
var phishURL string
func main() {
    // 把 --phishURL=... 的值存進變數 phishURL 裡面
    // 預設值是 "http://localhost:8080"
    // "部署在哪個網域" 是這個參數的說明,自己看得懂就可以了
    flag.StringVar(&phishURL, "phishURL", "http://localhost:8080", "部署在哪個網域")
    flag.Parse()
    db.Connect()
    // ...
}
這樣就完成了用 command line 指定部署網址,因為預設值就是 http://localhost:8080,所以開發時還是跑 go run main.go 就可以,部署的時候再跑 go run main.go --phishURL=https://phish-github.com,如果哪天要換網域也不用改程式碼
監聽的 port 其實也有這個問題,之前為了開發都是監聽在 8080 port
func main() {
    http.HandleFunc("/phish-admin", adminHandler)
    http.HandleFunc("/", handler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        panic(err)
    }
}
但實際部署的時候應該要在預設的 HTTP port 80,這邊也是用一樣的解法,把 port 從 command line 讀進來,預設值設為開發時的 8080
var port string
func main() {
    // ...
    // 把 --port=... 的值存進變數 port 裡面
    // 預設值是 ":8080"
    flag.StringVar(&port, "port", ":8080", "部署在哪個 port")
    flag.Parse()
    err := http.ListenAndServe(port, nil)
}
部署的時候就直接 go run main.go --port=:80 --phishURL=https://phish-github.com,很方便吧~
還記得剛剛用 flag 取值時都有加文字敘述嗎,編譯時 Go 會用他來生成使用說明,而且連預設值都有寫,真的很貼心 XD,以後我要寫 command line tool 大概都用 Go 寫了 ![]()

今天用 flag 把 phishURL 跟 port 兩個變數改成可以配置的,這樣在開發跟部署時就可以用同一份扣,只要執行的時候加個參數就可以了。今天是最後一天寫扣了,Larry850806/go-phishing 這個 repo 是最後的完成品,覺得有趣的話不妨幫我按個星星,要開 issue 或是送 PR 也都很歡迎歐~
明天開始就是講部署的東西了,實作部分有任何問題都歡迎提出來~謝謝大家
![]()
很棒的系列文,學習了怎麼刻釣魚網站了XD用Python來學一個試試看
XD謝謝支持,懂原理之後任何語言應該都做得出來,只是我這邊是用 Go