{"id":14,"date":"2026-02-15T18:02:54","date_gmt":"2026-02-15T10:02:54","guid":{"rendered":"http:\/\/43.138.147.217\/?p=14"},"modified":"2026-02-15T21:37:27","modified_gmt":"2026-02-15T13:37:27","slug":"%e6%89%8b%e5%8a%a8%e5%ae%9e%e7%8e%b0%e8%bd%ac%e5%8f%91%e9%80%bb%e8%be%91","status":"publish","type":"post","link":"https:\/\/fableary.top\/?p=14","title":{"rendered":"\u57fa\u4e8eGolang\u5b9e\u73b0\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\uff081\uff09\u624b\u52a8\u5b9e\u73b0\u8f6c\u53d1\u903b\u8f91"},"content":{"rendered":"\n<p><strong>\u76ee\u6807\uff1a\u7406\u89e3HTTP\u4ee3\u7406\u7684\u672c\u8d28\u2014\u2014\u8bfb\u53d6\u5ba2\u6237\u7aef\u8bf7\u6c42\uff0c\u5efa\u7acb\u5230\u540e\u7aef\u8fde\u63a5\uff0c\u53d1\u9001\u8bf7\u6c42\uff0c\u8bfb\u53d6\u54cd\u5e94\uff0c\u5199\u56de\u5ba2\u6237\u7aef\u3002<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">httputil.ReverseProxy \u5b9e\u73b0\u4e86\u4ec0\u4e48\uff1f<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy := httputil.NewSingleHostReverseProxy(target)<\/code><\/pre>\n\n\n\n<p>\u8fd9\u6bb5\u4ee3\u7801\u8fd4\u56de\u4e00\u4e2a ReverseProxy  \u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a http.Handler \u3002<\/p>\n\n\n\n<p>\u5f53\u8c03\u7528 proxy.ServeHTTP(w, r) \u65f6\uff0c\u5b9e\u73b0\u4e86\u4ee5\u4e0b\u51e0\u4e2a\u6838\u5fc3\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u590d\u5236\u5e76\u4fee\u6539\u539f\u59cb\u8bf7\u6c42<\/li>\n\n\n\n<li>\u53d1\u9001\u8bf7\u6c42\u5230\u540e\u7aef<\/li>\n\n\n\n<li>\u628a\u540e\u7aef\u7684\u4e0b\u54cd\u5e94\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef<\/li>\n\n\n\n<li>\u5904\u7406\u90e8\u5206\u7ec6\u8282<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u53cd\u5411\u4ee3\u7406<\/h3>\n\n\n\n<p>\u6211\u4eec\u5c1d\u8bd5\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a http.HandlerFunc \uff0c\u5728\u5176\u4e2d\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u521b\u5efa\u4e00\u4e2a\u65b0\u8bf7\u6c42\uff0c\u8be5\u8bf7\u6c42\u8981\u53d1\u5f80\u540e\u7aef<\/li>\n\n\n\n<li>\u628a\u539f\u59cb\u8bf7\u6c42\u7684\u5185\u5bb9\u590d\u5236\u5230\u65b0\u8bf7\u6c42\u91cc\uff08\u65b9\u6cd5\u3001body\u3001header\u7b49\uff09\uff0c\u4f46\u628a URL \u6539\u6210\u540e\u7aef\u7684\u5730\u5740<\/li>\n\n\n\n<li>\u7528 http.DefaultClient \u53d1\u9001\u65b0\u8bf7\u6c42\uff0c\u62ff\u5230\u54cd\u5e94<\/li>\n\n\n\n<li>\u628a\u540e\u7aef\u54cd\u5e94\u7684\u5185\u5bb9\uff08\u72b6\u6001\u7801\u3001header\u3001body\uff09\u5199\u56de\u7ed9\u5ba2\u6237\u7aef<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"io\"\n\t\"log\"\n\t\"net\/http\"\n\t\"net\/url\"\n)\n\nfunc ReverseProxy(target *url.URL) http.HandlerFunc {\n\treturn func(w http.ResponseWriter, r *http.Request) {\n\t\t\/\/ \u76ee\u6807 URL \u662f target\n\t\t\/\/ \u539f\u59cb\u8bf7\u6c42\u7684\u8def\u5f84\u662f r.URL.Path, \u67e5\u8be2\u662f r.URL.RawQuery\n\t\t\/\/ \u62fc\u63a5\u6210\u5b8c\u6574 URL: target.Scheme:\/\/target.Host\/r.URL.Path?r.URL.RawQuery\n\n\t\tproxyURL := target.ResolveReference(r.URL)\n\t\t\/\/  \u8be5\u65b9\u6cd5\u5c06\u4e00\u4e2a\u76f8\u5bf9 URL \u89e3\u6790\u6210\u4e00\u4e2a\u7edd\u5bf9 URL\n\n\t\treq, err := http.NewRequest(r.Method, proxyURL.String(), r.Body)\n\t\t\/\/ \u6ce8\u610f r.Body \u53ea\u80fd\u8bfb\u4e00\u6b21\uff0c\u5982\u679c\u4e4b\u524d\u88ab\u5176\u4ed6\u4e2d\u95f4\u4ef6\u8bfb\u8fc7\u4e86\u6216\u8005\u540e\u7eed\u8fd8\u9700\u8981\u8bfb\uff0c\u9700\u8981\u989d\u5916\u5904\u7406\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\n\t\treq.Header = r.Header.Clone()\n\n\t\treq.Host = target.Host\n\t\t\/\/ \u9ed8\u8ba4 http.NewRequest \u4f1a\u7528 URL \u4e2d\u7684 Host \u586b\u5145 req.Host\uff0c\u4f46 header \u4e2d\u7684 Host \u4f1a\u88ab\u5ffd\u7565\n\n\t\tclient := http.DefaultClient\n\t\tresp, err := client.Do(req)\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusBadGateway)\n\t\t\treturn\n\t\t}\n\n\t\tdefer resp.Body.Close()\n\t\t\/\/ \u907f\u514d\u8d44\u6e90\u6cc4\u9732\n\n\t\t\/\/ \u72b6\u6001\u7801\n\t\tw.WriteHeader(resp.StatusCode)\n\t\t\/\/ header\n\t\tfor key, values := range resp.Header {\n\t\t\tfor _, value := range values {\n\t\t\t\tw.Header().Add(key, value)\n\t\t\t}\n\t\t}\n\t\t\/\/ body\n\t\t_, err = io.Copy(w, resp.Body)\n\t\t\/\/ io.Copy(dst, src) \u7684\u4f5c\u7528\u662f\u628a src \u7684\u6240\u6709\u6570\u636e\u590d\u5236\u5230 dst \u91cc\n\t\t\/\/ dst \u5fc5\u987b\u5b9e\u73b0 io.Writer \u63a5\u53e3\uff08\u6709 Write \u65b9\u6cd5\uff09\n\t\t\/\/ src \u5fc5\u987b\u5b9e\u73b0 io.Reader \u63a5\u53e3\uff08\u6709 Read \u65b9\u6cd5\uff09\n\t\tif err != nil {\n\t\t\tlog.Println(\"Error copying body:\", err)\n\t\t}\n\t}\n}\n\nfunc main() {\n\ttarget, err := url.Parse(\"http:\/\/127.0.0.1:8000\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\thttp.HandleFunc(\"\/\", ReverseProxy(target))\n\n\tlog.Println(\"Starting proxy server on :8080\")\n\terr = http.ListenAndServe(\":8080\", nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u6807\uff1a\u7406\u89e3HTTP\u4ee3\u7406\u7684\u672c\u8d28\u2014\u2014\u8bfb\u53d6\u5ba2\u6237\u7aef\u8bf7\u6c42\uff0c\u5efa\u7acb\u5230\u540e\u7aef\u8fde\u63a5\uff0c\u53d1\u9001\u8bf7\u6c42\uff0c\u8bfb\u53d6\u54cd\u5e94\uff0c\u5199\u56de\u5ba2\u6237\u7aef\u3002 httput &#8230; <a title=\"\u57fa\u4e8eGolang\u5b9e\u73b0\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\uff081\uff09\u624b\u52a8\u5b9e\u73b0\u8f6c\u53d1\u903b\u8f91\" class=\"read-more\" href=\"https:\/\/fableary.top\/?p=14\" aria-label=\"\u9605\u8bfb \u57fa\u4e8eGolang\u5b9e\u73b0\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\uff081\uff09\u624b\u52a8\u5b9e\u73b0\u8f6c\u53d1\u903b\u8f91\">\u9605\u8bfb\u66f4\u591a<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-golangproxy"],"_links":{"self":[{"href":"https:\/\/fableary.top\/index.php?rest_route=\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fableary.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fableary.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fableary.top\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fableary.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14"}],"version-history":[{"count":4,"href":"https:\/\/fableary.top\/index.php?rest_route=\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":20,"href":"https:\/\/fableary.top\/index.php?rest_route=\/wp\/v2\/posts\/14\/revisions\/20"}],"wp:attachment":[{"href":"https:\/\/fableary.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fableary.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fableary.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}