Go http.ListendServe处理程序函数在端口80上执行了两次

Go http.ListendServe处理程序函数在端口80上执行了两次,go,Go,如果我在端口8080上运行以下简单的http服务器代码,一切都会正常工作。如果我在端口80上运行相同的代码,只需更改端口,处理程序函数就会在每个请求中执行两次。为什么,以及如何修复它 // httptest project main.go package main import ( "net/http" "log" "fmt" "html" ) var count int func defaultHandler(w http.ResponseWriter,

如果我在端口8080上运行以下简单的http服务器代码,一切都会正常工作。如果我在端口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。同时,控制台输出的print语句执行两次

终端控制台在端口80上运行时有3个请求:

>go run main.go
1 [::1]:51335
2 [::1]:51335
3 [::1]:51335
4 [::1]:51335
5 [::1]:51335
6 [::1]:51335
浏览器中的响应为
Hello,“/”count=1
Hello,“/”count=3
Hello,“/”count=5

我已经在Windows 10上运行了这个程序,使用Go版本go1.9.2 Windows/amd64和最新的Google Chrome浏览器


但是,我在远程Linux服务器上的一个简单web应用程序中检测到了这个问题,其中的代码是用go版本go1.9.1 Linux/amd64编译的。

尝试记录请求。可能浏览器正在调用
/favicon.ico

我刚刚在电脑上打开Fiddler的情况下尝试了它

我注意到当使用Google Chrome导航到url时,浏览器发出2个请求

GET / HTTP/1.1
GET /favicon.ico HTTP/1.1
favicon的请求也由defaultHandler处理,这会导致计数增加


我也尝试过firefox,它没有通过添加
if r.URL.Path!=“/”{http.Error(w,“未找到”,404);返回}
到处理程序的开头。