[解決済み] http.RequestからクライアントのIPアドレスを取得する正しい方法
質問
からすべてのクライアントの IP アドレスを取得する正しい方法は何ですか?
http.Request
? では
PHP
には、たくさんの
変数があります。
をチェックする必要があります。Goでも同じなのでしょうか?
私が見つけたのは
req.RemoteAddr
また、リクエストの大文字と小文字は区別されますか? 例えば
x-forwarded-for
と同じです。
X-Forwarded-For
と
X-FORWARDED-FOR
? から
req.Header.Get("X-FORWARDED-FOR")
)
どのように解決するのですか?
を見てみると http.リクエスト を見ると、以下のようなメンバ変数があることがわかります。
// HTTP defines that header names are case-insensitive.
// The request parser implements this by canonicalizing the
// name, making the first character and any characters
// following a hyphen uppercase and the rest lowercase.
//
// For client requests certain headers are automatically
// added and may override values in Header.
//
// See the documentation for the Request.Write method.
Header Header
// RemoteAddr allows HTTP servers and other software to record
// the network address that sent the request, usually for
// logging. This field is not filled in by ReadRequest and
// has no defined format. The HTTP server in this package
// sets RemoteAddr to an "IP:port" address before invoking a
// handler.
// This field is ignored by the HTTP client.
RemoteAddr string
を使うことができます。
RemoteAddr
を使ってリモートクライアントの IP アドレスとポート (フォーマットは "IP:port") を取得し、これは元のリクエスト元のアドレスである
または最後のプロキシ
(例えば、サーバの前にあるロードバランサ) のアドレスです。
確かにこれだけです。
次にヘッダを調査すると 大文字小文字を区別しない (上記のドキュメントによる) であり、すべての例が動作し、同じ結果をもたらすことを意味します。
req.Header.Get("X-Forwarded-For") // capitalisation
req.Header.Get("x-forwarded-for") // doesn't
req.Header.Get("X-FORWARDED-FOR") // matter
これは、内部的に
http.Header.Get
がキーを正規化するからです。(もしあなたがヘッダーマップに直接アクセスしたいのであれば、 Get
を通してではなく、直接ヘッダーマップにアクセスしたい場合は
http.CanonicalHeaderKey
を最初に使う必要があります)。
最後に
"X-Forwarded-For"
は、おそらくクライアントの IP に関するより多くの情報を取得するために見てみたいフィールドでしょう。クライアントが望めばそこに何でも入れることができるので、これはリモート側で使用されている HTTP ソフトウェアに大きく依存します。また
期待される
形式
は、IP アドレスのカンマ+スペース区切りリストです。たとえば、選択した単一の IP (おそらくリストの最初のもの) を取得するために、それを少し解析する必要があります。
// Assuming format is as expected
ips := strings.Split("10.0.0.1, 10.0.0.2, 10.0.0.3", ", ")
for _, ip := range ips {
fmt.Println(ip)
}
が生成されます。
10.0.0.1
10.0.0.2
10.0.0.3
関連
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
[解決済み] HTTPポストで文字+が%2Bに変換される
-
[解決済み] HTTPヘッダーの大文字と小文字は区別されますか?
-
[解決済み] URLクエリパラメータを含むHTTP POST -- 良いアイデアかどうか?
-
[解決済み] PHP の cURL は、一度のリクエストでレスポンスヘッダーとボディーの両方を取得できますか?
-
[解決済み] "宣言されているが使用されていない "という迷惑なエラーを回避する方法
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み】GETリクエストで同じパラメータ名で複数の値を渡す場合の正しい方法
-
[解決済み] サーバーサイドでCookieを削除する正しい方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] プロキシが全く応答を受け取らない場合、502 HTTPステータスコードを使用すべきですか?
-
[解決済み] X-REQUEST-ID httpヘッダーとは何ですか?
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み】REST APIでPATCHとPUTのどちらを使うべきですか?
-
[解決済み】cURLを使用してBasic HTTP認証を正しく定義する方法は?
-
[解決済み】HTTPプロトコルでクッキーはどのように渡されるのですか?
-
[解決済み】PHPでクライアントIPアドレスを取得する【重複あり
-
[解決済み】Accept* HTTPヘッダのq=0.5とは何ですか?
-
[解決済み] URLマトリックスパラメータとクエリパラメータの比較
-
[解決済み] 304 Not Modified」は具体的にどのように機能するのですか?