http.ListenAndServe处理函数在端口80上执行两次

时间:2017-11-11 16:57:46

标签: go

如果我在端口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=1Hello, "/" count=3Hello, "/" count=5

我一直在Windows 10上使用Go版本go1.9.2 windows / amd64以及最新的Google Chrome浏览器在本地运行。

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

2 个答案:

答案 0 :(得分:3)

我刚刚在我的电脑上尝试使用Fiddler打开

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

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

对favicon的请求也由defaultHandler处理,这导致计数递增

我也尝试过使用firefox,但它没有发送另一个关于favicon的请求

答案 1 :(得分:1)

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