2017-11-11 2 views
0

ポート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=1Hello, "/" count=3Hello, "/" count=5です。

私はGoバージョンのgo1.9.2 windows/amd64と最新のGoogle ChromeブラウザでWindows 10でこれをローカルに実行しています。

しかし、コードがgoバージョンgo1.9.1 linux/amd64でコンパイルされているリモートLinuxサーバー上の単純なWebアプリケーションで問題が検出されました。

+0

if r.URL.Path!= "/" {http.Error(w、 "Not Found"、404);を追加して修正しました。ハンドラの先頭に 'return'を返します。 –

答えて

3

/favicon.icoを呼んでいる私は、ブラウザが2要求

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

要求を行うGoogle Chromeを使用してURLに移動するとき、私は気づいた

を開くフィドラーと私のPC上でそれを試してみましたfaviconもdefaultHandlerによって処理され、カウントが増えます

私もfirefoxで試してみましたが、faviconの別のリクエストはありません

0

リクエストを記録してください。おそらくブラウザは

関連する問題