go 代理服务器(cookie设置失败无法登录),nginx设置Domain

 1 Method POST
 2 URL https://vjudge.net/user/login
 3 Proto HTTP/1.1
 4 ProtoMajor 1
 5 ProtoMinor 1
 6 Header map[Referer:[http://127.0.0.1:8002/] Accept-Language:[zh-CN,zh;q=0.8] Connection:[keep-alive] Origin:[http://127.0.0.1:8002] Content-Type:[application/x-www-form-urlencoded; charset=UTF-8] X-Requested-With:[XMLHttpRequest] Accept-Encoding:[gzip, deflate, br] Cookie:[io=oiuZ1YssLxHIpLGMAAAo; _ga=GA1.1.1822669068.1495898591; _gid=GA1.1.2058057953.1495904201] Content-Length:[39] User-Agent:[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36] Accept:[*/*]]
 7 Body &{0xc42011afe0 <nil> <nil> false true {0 0} false false false 0x6068c0}
 8 ContentLength 39
 9 TransferEncoding []
10 Close false
11 Host vjudge.net
12 Form map[]
13 PostForm 0x6114c0
14 MultipartForm <nil>
15 Trailer map[]
16 RemoteAddr 127.0.0.1:37558
17 RequestURI 
18 TLS <nil>
19 Cancel <nil>
20 Response <nil>
21 --------------------------------------------------------------
22 Status 200 OK
23 StatusCode 200
24 Proto HTTP/2.0
25 ProtoMajor 2
26 ProtoMinor 0
27 Header map[Server:[nginx/1.10.3] Date:[Sat, 27 May 2017 16:56:53 GMT] Content-Type:[text/plain;charset=ISO-8859-1] Content-Length:[7] Set-Cookie:[JSESSIONID=F55D0140082CA33C63F7A7C7B4C968B9; Domain=.vjudge.net; Path=/; HttpOnly Jax.Q=1406100039|89TFHFKYFR2DTH8AVLC2JRLIUTMJLE; Domain=.vjudge.net; Expires=Sun, 27-May-2018 16:56:53 GMT; Path=/] Access-Control-Allow-Origin:[http://127.0.0.1:8002] Vary:[Origin] Access-Control-Allow-Credentials:[true]]
28 Body {0xc420405a40}
29 ContentLength 7
30 TransferEncoding []
31 Close false
32 Uncompressed false
33 Trailer map[]
34 Request &{POST https://vjudge.net/user/login HTTP/1.1 1 1 map[Connection:[keep-alive] Origin:[http://127.0.0.1:8002] Content-Type:[application/x-www-form-urlencoded; charset=UTF-8] X-Requested-With:[XMLHttpRequest] Referer:[http://127.0.0.1:8002/] Accept-Language:[zh-CN,zh;q=0.8] Content-Length:[39] User-Agent:[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36] Accept:[*/*] Accept-Encoding:[gzip, deflate, br] Cookie:[io=oiuZ1YssLxHIpLGMAAAo; _ga=GA1.1.1822669068.1495898591; _gid=GA1.1.2058057953.1495904201]] 0xc4200e6740 <nil> 39 [] false vjudge.net map[] map[] <nil> map[] 127.0.0.1:37558  <nil> <nil> <nil> 0xc4200e6780}
35 TLS &{771 true false 49200 h2 true  [0xc420152000 0xc420152480] [[0xc420152000 0xc420152480 0xc420252900]] [] [] [23 179 124 44 29 163 172 94 255 255 155 248]}
36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
login的request和response

设置cookie失败是因为Set-Cookie的Domain=.vjudge.net; 改为自己的域名“.gzhuacm.cn"或者”“空字符串就可以了,有这个的话浏览器会根据域名设置为指定域名的cookie

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

type route struct {
}

func printReq(req *http.Request) {
	fmt.Println("Method", req.Method)
	fmt.Println("URL", req.URL)
	fmt.Println("Proto", req.Proto)
	fmt.Println("ProtoMajor", req.ProtoMajor)
	fmt.Println("ProtoMinor", req.ProtoMinor)
	fmt.Println("Header", req.Header)
	fmt.Println("Body", req.Body)
	fmt.Println("ContentLength", req.ContentLength)
	fmt.Println("TransferEncoding", req.TransferEncoding)
	fmt.Println("Close", req.Close)
	fmt.Println("Host", req.Host)
	fmt.Println("Form", req.Form)
	fmt.Println("PostForm", req.PostForm)
	fmt.Println("MultipartForm", req.MultipartForm)
	fmt.Println("Trailer", req.Trailer)
	fmt.Println("RemoteAddr", req.RemoteAddr)
	fmt.Println("RequestURI", req.RequestURI)
	fmt.Println("TLS", req.TLS)
	fmt.Println("Cancel", req.Cancel)
	fmt.Println("Response", req.Response)
	fmt.Println("--------------------------------------------------------------")
}
func printRes(res *http.Response) {
	fmt.Println("Status", res.Status)
	fmt.Println("StatusCode", res.StatusCode)
	fmt.Println("Proto", res.Proto)
	fmt.Println("ProtoMajor", res.ProtoMajor)
	fmt.Println("ProtoMinor", res.ProtoMinor)
	fmt.Println("Header", res.Header)
	fmt.Println("Body", res.Body)
	fmt.Println("ContentLength", res.ContentLength)
	fmt.Println("TransferEncoding", res.TransferEncoding)
	fmt.Println("Close", res.Close)
	fmt.Println("Uncompressed", res.Uncompressed)
	fmt.Println("Trailer", res.Trailer)
	fmt.Println("Request", res.Request)
	fmt.Println("TLS", res.TLS)
	fmt.Println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
}
func (r route) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	//req.URL.Host = "https://vjude.net"
	printReq(req)
	path := "https://vjudge.net"
	originDomain := "Domain=.vjudge.net;"
	domain := "Domain=.vjudge.gzhuacm.cn;"
	//u, err := url.Parse("https://vjudge.net")
	u, err := url.Parse(path + req.RequestURI)
	if err != nil {
		fmt.Println(err)
		return
	}
	//fmt.Println("url:", u.RawPath, u.Host, u.RawQuery)
	client0 := &http.Client{}
	//req1, err := http.NewRequest("GET", path, nil)
	//printReq(req1)
	req.URL = u
	req.RequestURI = ""
	req.Host = u.Host
	printReq(req)
	//req1, err := http.NewRequest(req.Method, path+req.RequestURI, req.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	resp, err := client0.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}
	printRes(resp)
	defer resp.Body.Close()

	for k, v := range resp.Header {
		for _, vv := range v {
			if strings.Count(vv, originDomain)!=0  {
				vv = strings.Replace(vv, originDomain, domain, -1)
			}
			w.Header().Add(k, vv)
		}
	}
	fmt.Println(w.Header(),"\n----------------------\n");

	w.WriteHeader(resp.StatusCode)
	result, err := ioutil.ReadAll(resp.Body)
	if err != nil && err != io.EOF {
		panic(err)
	}
	w.Write(result)
}
func main() {
	r := &route{}
	http.ListenAndServe(":8002", r)
}

  

然后用nginx监听vjudge.gzhuacm.cn,转发到本地8002端口

如果用内网的话setsid autossh -CNg -L 9000:127.0.0.1:8002 root@gzhuacm.cn 将本地9000端口的访问转发到远程的8002端口处理(两层代理),访问内网的ip:9000 ,用两层代理是为了实现网上断网后也可以通过校园网访问oj

 

 

后面去nginx官网差了下,原来可以直接在nginx改,这样就不用go转发了

Syntax:proxy_cookie_domain off;
proxy_cookie_domain domain replacement;
Default:
proxy_cookie_domain off;
Context:httpserverlocation

然后改成proxy_cookie_domain .vjudge.net vj.gzhuacm.cn

官网文档

吃了个教训,有问题先查官网

转载于:https://www.cnblogs.com/cdyboke/p/6914873.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值