ポート8080で次の単純なhttpサーバーコードを実行すると、すべて正常に動作します。ポート80で同じコードを実行すると、ポートを変更するだけでハンドラ関数が各リクエストで2回実行されます。なぜ、それを修正するのですか?http.ListenAndServeハンドラー関数がポート80で2回実行されました
// 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文が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=1
、Hello, "/" count=3
とHello, "/" count=5
です。
私はGoバージョンのgo1.9.2 windows/amd64と最新のGoogle ChromeブラウザでWindows 10でこれをローカルに実行しています。
しかし、コードがgoバージョンgo1.9.1 linux/amd64でコンパイルされているリモートLinuxサーバー上の単純なWebアプリケーションで問題が検出されました。
if r.URL.Path!= "/" {http.Error(w、 "Not Found"、404);を追加して修正しました。ハンドラの先頭に 'return'を返します。 –