2017-11-11 45 views
0

如果我在端口8080上運行以下簡單的http服務器代碼,一切都按預期工作。如果我在端口80上運行相同的代碼,只需更改端口,處理函數會在每個請求中執行兩次。爲什麼,以及如何解決它?http.ListenAndServe處理函數在端口80上執行兩次

// httptest project main.go 
package main 

import (
    "net/http" 
    "log" 
    "fmt" 
    "html" 
) 

var count int 

func defaultHandler(w http.ResponseWriter, r *http.Request) { 
    count++ 
    fmt.Fprintf(w, "Hello, %q count=%d", html.EscapeString(r.URL.Path), count) 
    fmt.Println(count,r.RemoteAddr) 
} 

func main() { 
    http.HandleFunc("/", defaultHandler) 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

如果我輸入localhost:8080在瀏覽器中,我得到從1開始以計數的響應,並與每個新的請求增加1。

如果我將代碼更改爲端口80,並在瀏覽器中輸入localhost或localhost:80,則會得到第一個響應,計數從1開始,但隨後每增加2個請求。與此同時,控制檯輸出的打印語句被執行兩次。 3個請求在端口80上運行時

終端控制檯:

>go run main.go 
1 [::1]:51335 
2 [::1]:51335 
3 [::1]:51335 
4 [::1]:51335 
5 [::1]:51335 
6 [::1]:51335 

在瀏覽器中的反應是Hello, "/" count=1Hello, "/" count=3Hello, "/" count=5

我一直在使用Go版本go1.9.2 windows/amd64和最新的Google Chrome瀏覽器在Windows 10上本地運行此程序。

但是,我在遠程Linux服務器上的一個簡單Web應用程序中檢測到問題,其中的代碼已使用go版本go1.9.1 linux/amd64進行編譯。

+0

通過添加'if r.URL.Path!=「/」{http.Error(w,「Not Found」,404);返回}'到處理程序的開始。 –

回答

3

我剛在我的電腦使用Fiddler打開

導航到使用谷歌Chrome瀏覽器的網址時,我注意到,瀏覽器發出2請求

GET/HTTP/1.1 
GET /favicon.ico HTTP/1.1 

了該請求favicon也得到處理的defaultHandler,這導致計數增加

我也試過用firefox,它不會發送另一個請求的favicon

0

嘗試記錄請求。可能是瀏覽器調用/favicon.ico