目次
1。デフォルトの動作を理解します
CheckRedirectでリダイレクトポリシーをカスタマイズします
例:リダイレクトを3に制限します
例:すべてのリダイレクトを防ぎます
3.リダイレクト中のヘッダーの保存またはリクエストの変更
4.一般的な落とし穴とヒント
まとめ
ホームページ バックエンド開発 Golang GOのHTTPクライアントのリダイレクトを処理する方法

GOのHTTPクライアントのリダイレクトを処理する方法

Aug 31, 2025 am 01:13 AM

GoのHTTP.Clientは、デフォルトで最大10のリダイレクトを自動的に追跡します。 1.デフォルトでは、301、302などのリダイレクトが自動的に処理され、最終応答が返されます。 2。リダイレクトの数を制限するなど、CheckRedirect関数を設定することで動作をカスタマイズし、len(via)> = 3の場合にエラーを返し、最大2つのリダイレクトを制限します。 3. http.erruselastresponseを返すことにより、リダイレクトを防ぎ、元のリダイレクト応答を取得できます。これにより、ロケーションヘッダーのチェックが容易になります。 4.機密情報の漏れを防ぐために、ターゲットドメイン名に従って承認ヘッダーを削除するなど、リダイレクトプロセス中にリクエストを変更できます。 5.円形のリダイレクト、メソッドの変更(変化後の取得など)、クロスドメインのセキュリティ、コンテキストキャンセルなどの問題に注意してください。要するに、CheckRedirectはリダイレクションの動作を完全に制御し、リダイレクトシナリオの細かい管理を必要とする要件に適しています。

GOのHTTPクライアントのリダイレクトを処理する方法

GOのHTTPクライアントのリダイレクトの処理はnet/httpパッケージの組み込み機能のおかげで簡単です。デフォルトでは、Goのhttp.Clientリダイレクトを自動的にフォローしますが、リダイレクト動作の検査、リダイレクトの数の制限、または完全に無効にするなど、ニーズに応じてこの動作をカスタマイズできます。

GOのHTTPクライアントのリダイレクトを処理する方法

GOのリダイレクト処理を制御する方法は次のとおりです。

1。デフォルトの動作を理解します

デフォルトでは、 http.Clientリクエストのために最大10のリダイレクトに従います。リダイレクト(301、302、307など)が遭遇した場合、クライアントはLocationヘッダーで指定されたURLに次のリクエストを自動的に行います。

GOのHTTPクライアントのリダイレクトを処理する方法
 rep、err:= http.get( "https://httpbin.org/redirect/1")
err!= nil {
    log.fatal(err)
}
defer resp.body.close()
//これは自動的にリダイレクトに従います

最終的な応答(リダイレクト後の後)が返され、特に構成しない限り中間の手順は表示されません。

CheckRedirectでリダイレクトポリシーをカスタマイズします

http.ClientCheckRedirect関数を設定することにより、リダイレクト動作を制御できます。この関数は各リダイレクトに対して呼び出され、それに従うか、リクエストを変更するか、中止するかを決定できます。

GOのHTTPクライアントのリダイレクトを処理する方法

例:リダイレクトを3に制限します

クライアント:=&http.client {
    checkredirect:func(req *http.request、via [] *http.request)エラー{
        len(via)> = 3 {
            fmt.errorfを返す(「リダイレクトが多すぎる」)
        }
        nilを返します
    }、
}

rep、err:= client.get( "https://httpbin.org/redirect/5")
err!= nil {
    log.printf( "要求が失敗した:%v"、err)
}

この例では:

  • via 、現在のリクエストを含むリクエストのスライスです(最初のリクエストを含む)。
  • 最大2つのリダイレクト(合計3つのリクエスト)を許可し、それ以外の場合はエラーを返します。

例:すべてのリダイレクトを防ぎます

クライアント:=&http.client {
    checkredirect:func(req *http.request、via [] *http.request)エラー{
        http.erruselastresponseを返す//リダイレクトに従わないでください、リダイレクト応答を返します
    }、
}

rep、err:= client.get( "https://httpbin.org/redirect/1")
err!= nil {
    log.fatal(err)
}
// resp.statuscodeは302になり、ロケーションヘッダーを検査できます
場所:= resp.header.get( "location")
fmt.println( "Redirect to:"、location)

http.ErrUseLastResponseを使用すると、クライアントに、それに従う代わりにリダイレクト応答を停止して返すように指示します。

3.リダイレクト中のヘッダーの保存またはリクエストの変更

ヘッダーを調整することをお勧めします(たとえば、セキュリティのために別のドメインにリダイレクトするAuthorization削除します)。

クライアント:=&http.client {
    checkredirect:func(req *http.request、via [] *http.request)エラー{
        //別のドメインに承認ヘッダーを送信しないでください
        if req.url.hostname()!= via [0] .url.hostname(){{
            req.header.del( "Authorization")
        }
        nilを返します
    }、
}

これにより、リダイレクト中に敏感なヘッダーがドメイン間でリークされないようになります。

4.一般的な落とし穴とヒント

  • 円形リダイレクト:デフォルトの制限があっても、一部のエンドポイントはループを引き起こす可能性があります。常に実際のエンドポイントでテストしてください。
  • メソッドの変更:一部のリダイレクト(302など)は、歴史的にクライアントを取得するためにポストを変更します。 307または308を使用して、方法と本体を保存します。
  • コンテキストキャンセル:リダイレクトクライアントのコンテキストを尊重します。リダイレクト中にコンテキストがキャンセルされた場合、プロセスは停止します。

まとめ

  • Go's http.Clientは、デフォルトでリダイレクトをフォローします(最大10)。
  • CheckRedirectを使用して動作をカスタマイズします。リダイレクトを制限、検査、またはブロックします。
  • nilを返して、 http.ErrUseLastResponseを停止してリダイレクト応答、またはその他のエラーを返します。
  • セキュリティ(ヘッダー、ドメイン)とパフォーマンス(ループ、タイムアウト)に注意してください。

基本的に、 CheckRedirect完全に制御できます。デフォルトの動作が十分でない場合に使用します。

以上がGOのHTTPクライアントのリダイレクトを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Goでパッケージとインポートを管理する方法は? Goでパッケージとインポートを管理する方法は? Sep 01, 2025 am 02:10 AM

usegomodulesbyrunninggomodinittucreateago.modfile、whithmanages -dependenciesandions.2.organizecodeIntopackagesは、Eachdirectoryisapackage where onsistentpackageName、できれば誘惑を抑制することができます

ゴーアウチンでパニックを処理する方法 ゴーアウチンでパニックを処理する方法 Aug 24, 2025 am 01:55 AM

TohandlepanicsingOroutines、使用済みのinsidetegoroutinetocatchandmanagetheThemlocally.2.を使用している

GOでカスタムビルドタグを作成する方法 GOでカスタムビルドタグを作成する方法 Aug 27, 2025 am 04:37 AM

custombuildtagsingoallowconditionalcompalilation basedoneNvironment、Architecture、orcustomscenariosbyusing // go:buildtagsattheTopoffiles、burtientenabledviagobuild-tags "tagname"、supportinglogicaloperatorslike && |

goで[] intを[] uint8(byte array)に変換する方法 goで[] intを[] uint8(byte array)に変換する方法 Sep 01, 2025 am 08:15 AM

この記事では、[] intスライスをgoで[] uint8(byte array)に変換する方法について説明します。 GOのINTタイプのサイズがプラットフォーム関連(32ビットまたは64ビット)であることを考えると、記事は反射パッケージを使用してINTサイズを動的に取得し、エンコード/バイナリパッケージを組み合わせて効率的かつ安全にコンバージョンを組み合わせて、特定のコード例と開発者を提供するための開発者を提供するための特定のコードの例を提供する方法を詳しく説明します。

GOのHTTPクライアントのリダイレクトを処理する方法 GOのHTTPクライアントのリダイレクトを処理する方法 Aug 31, 2025 am 01:13 AM

GoのHTTP.Clientは、デフォルトで最大10のリダイレクトを自動的に追跡します。 1.デフォルトでは、301、302などのリダイレクトが自動的に処理され、最終応答が返されます。 2。リダイレクトの数を制限するなど、CheckRedirect関数を設定することで動作をカスタマイズし、len(via)> = 3の場合にエラーを返し、最大2つのリダイレクトを制限します。 3. http.erruselastresponseを返すことにより、リダイレクトを防ぎ、元のリダイレクト応答を取得できます。これは、ロケーションヘッダーのチェックに便利です。 4.機密情報の漏れを防ぐために、ターゲットドメイン名に従って承認ヘッダーを削除するなど、リダイレクトプロセス中にリクエストを変更できます。 5.ループに注意を払う必要があります

言語同時プログラミング:Sync.waitgroupの理解と使用 言語同時プログラミング:Sync.waitgroupの理解と使用 Aug 31, 2025 am 07:48 AM

Sync.WaitGroupは、GO言語で同時同期の重要な原始です。これにより、メインのゴルウチンがサブゴルチンのグループが実行されるのを待つことができます。カウンターメカニズムを通じて、ウェイトグループは、すべての同時タスクが完了し、プログラムが引き続き実行され、人種条件とリソースの漏れを効果的に回避し、堅牢な同時アプリケーションを構築するための重要なツールであることを保証できます。

Golangバイナリに静的資産を埋め込む方法 Golangバイナリに静的資産を埋め込む方法 Aug 30, 2025 am 04:50 AM

Goの埋め込みパッケージを使用して、静的リソースをバイナリファイルに直接埋め込むことができます。 go1.16から、// go:埋め込み指令を使用して、変数の前にディレクティブ、単一のファイル、複数のファイル、またはディレクトリ全体を埋め込み、文字列をサポートすることができます。埋め込まれたコンテンツは、コンパイル時にバイナリに固化します。パスは存在する必要があり、ケースに敏感です。 Go-bindataなどのサードパーティツールの代わりに埋め込みを使用することをお勧めします。この方法はシンプルで効率的であり、標準的な慣行となっています。

GOのさまざまなタイプのゼロ値は何ですか? GOのさまざまなタイプのゼロ値は何ですか? Aug 22, 2025 am 04:59 AM

numerictypeshavezerovalue0; 2.booleantypehaszerovaluefalse; 3.StringTypehaszeroValue ""; 4.pointertypeshavezerovaluenil; 5.in TerfaceTypeshavezerovaluenil; 6.ArrayTypeshavealLementszeroed; 7.Slicetypeshavezerovaluenil; 8.Maptypeshavezerovaluenil; 9

See all articles