当前位置: 首页 > news >正文

使页面具有动态效果的网站建设技术是如何用手机免费创建网站

使页面具有动态效果的网站建设技术是,如何用手机免费创建网站,做企业云网站的企业邮箱,南昌电子商务网站建设跨域案例go gf ,请求代理,前端请求后端A转后端B 案例:从前端请求后端A(路径携带argusx),后端A转发请求到多个不同地区(可一个)后端B(切掉argusx,其他不变进行请求)&…

跨域案例go gf ,请求代理,前端请求后端A转后端B

案例:从前端请求后端A(路径携带argusx),后端A转发请求到多个不同地区(可一个)后端B(切掉argusx,其他不变进行请求),由请求头x-proxy指定请求哪个服务端

方案一:handler形式处理:

func InitRouter() {s := g.Server()// 分组路由注册方式app.Api = s.Group("/argusx", func(group *ghttp.RouterGroup) {// 跨域中间件service.Middleware.InitGroup(group)ReverseProxy(group, "/xxx/")})
}// InitGroup 注册中间件
func (s *middlewareService) InitGroup(group *ghttp.RouterGroup) {group.Middleware(// 跨域处理s.CORS,//s.Auth,)
}
// 使用默认跨域处理
func (s *middlewareService) CORS(r *ghttp.Request) {//r.Response.CORSDefault() //若是请求头没有新的,则直接用default,否则用下面三行代码options := r.Response.DefaultCORSOptions()options.AllowHeaders = options.AllowHeaders + ",X-Proxy"r.Response.CORS(options)r.Middleware.Next()
}
func ReverseProxy(pg *ghttp.RouterGroup, path string) {op := func(r *ghttp.Request) {// 根据code拿到地址,可用自己的方式获取参数argusvoiceCode := r.GetHeader("x-proxy")g.Log().Infof("[argusvoice] argusvoiceCode=%s", argusvoiceCode)if argusvoiceCode != "" {argusvoiceApi := service.GetArgusVoiceUrlByCode(argusvoiceCode)g.Log().Infof("[argusvoice] argusvoiceApi=%s", argusvoiceApi)remote, err := url.Parse(argusvoiceApi)if err != nil {fmt.Println(err.Error())g.Log().Errorf("[argusvoice] url parse error, argusvoiceApi=%s, error=%v", argusvoiceApi, err)}reverseProxy := proxy.GoReverseProxy(&proxy.RProxy{Remote: remote,})if err != nil {fmt.Println(err.Error())r.ExitAll()return}reverseProxy.ServeHTTP(r.Response.Writer, r.Request)r.ExitAll()} else {r.Middleware.Next()}}pg.Bind([]ghttp.GroupItem{{"ALL", path + "*", op}})
}

方案二:中间件的形式代理:
对所有请求都拦截,包括options,这样需要自己处理options请求,options请求是为了协商请求头,所以需要返回成功以及必要信息方便后期请求携带。
请求允许的加上x-proxy,注意option请求是拿不到具体的值
坏处:无法使用框架自带的options处理

s.BindMiddlewareDefault(func(r *ghttp.Request) {// 根据code拿到地址accessControlHeaders := r.Header.Get("Access-Control-Request-Headers")isProxy := strings.Contains(accessControlHeaders, "x-proxy")argusvoiceCode := r.GetHeader("x-proxy")r.Header.Set("Access-Control-Allow-Origin", "*")g.Log().Infof("[argusvoice] argusvoiceCode=%s", argusvoiceCode)if isProxy || (argusvoiceCode != "") {argusvoiceApi := service.GetArgusVoiceUrlByCode(argusvoiceCode)if r.Request.Method == "OPTIONS" {r.Response.Status = 200// 以下头部请参照自己正常请求的头部r.Response.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin")) //此处不能写作*r.Response.Header().Set("Access-Control-Allow-Credentials", "true")r.Response.Header().Set("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token, x-token, x-requested-with,Accept,Origin,Referer,User-Agent,x-proxy")r.Response.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE")r.Response.Header().Set("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")return}g.Log().Infof("[argusvoice] argusvoiceApi=%s", argusvoiceApi)remote, err := url.Parse(argusvoiceApi)if err != nil {fmt.Println(err.Error())g.Log().Errorf("[argusvoice] url parse error, argusvoiceApi=%s, error=%v", argusvoiceApi, err)}reverseProxy := proxy.GoReverseProxy(&proxy.RProxy{Remote: remote,})if err != nil {fmt.Println(err.Error())r.ExitAll()return}reverseProxy.ServeHTTP(r.Response.Writer, r.Request)r.ExitAll()} else {r.Middleware.Next()}
})

proxy文件:(此处代码大部分抄自https://github.com/hezhizheng/go-reverse-proxy/blob/master/handle.go)
该项目使用案例:https://hzz.cool/blog/implementation-of-simple-http-and-https-reverse-proxy-by-golang

package proxyimport ("github.com/gogf/gf/frame/g""net/http""net/http/httputil""net/url""strings"
)type RProxy struct {Remote *url.URL
}func GoReverseProxy(this *RProxy) *httputil.ReverseProxy {remote := this.Remoteproxy := httputil.NewSingleHostReverseProxy(remote)proxy.Director = func(request *http.Request) {Path := ""targetQuery := remote.RawQueryrequest.URL.Scheme = remote.Schemerequest.URL.Host = remote.Hostrequest.Host = remote.HostPath, request.URL.RawPath = joinURLPath(remote, request.URL)Paths := strings.Split(Path, "/argusx")request.URL.Path = Paths[1]g.Log().Infof("[argusvoice] request.Body=%v", request.Body)if targetQuery == "" || request.URL.RawQuery == "" {request.URL.RawQuery = targetQuery + request.URL.RawQuery} else {request.URL.RawQuery = targetQuery + "&" + request.URL.RawQuery}g.Log().Infof("[argusvoice] request.URL.Path=%s, request.URL.RawQuery=%s", request.URL.Path, request.URL.RawQuery)}proxy.ModifyResponse = func(response *http.Response) error {response.Header.Del("Access-Control-Allow-Origin")response.Header.Del("Access-Control-Allow-Credentials")response.Header.Del("Access-Control-Allow-Headers")response.Header.Del("Access-Control-Allow-Methods")return nil}return proxy
}// go sdk 源码
func joinURLPath(a, b *url.URL) (path, rawpath string) {if a.RawPath == "" && b.RawPath == "" {return singleJoiningSlash(a.Path, b.Path), ""}// Same as singleJoiningSlash, but uses EscapedPath to determine// whether a slash should be addedapath := a.EscapedPath()bpath := b.EscapedPath()aslash := strings.HasSuffix(apath, "/")bslash := strings.HasPrefix(bpath, "/")switch {case aslash && bslash:return a.Path + b.Path[1:], apath + bpath[1:]case !aslash && !bslash:return a.Path + "/" + b.Path, apath + "/" + bpath}return a.Path + b.Path, apath + bpath
}// go sdk 源码
func singleJoiningSlash(a, b string) string {aslash := strings.HasSuffix(a, "/")bslash := strings.HasPrefix(b, "/")switch {case aslash && bslash:return a + b[1:]case !aslash && !bslash:return a + "/" + b}return a + b
}
http://www.hkea.cn/news/34542/

相关文章:

  • 网络运营主要工作内容seo教程自学入门教材
  • 用其他商标在自己网站做宣传百度云网盘资源分享网站
  • 对商家而言网站建设的好处淘宝关键词查询工具哪个好
  • 做简单网站代码关键词推广价格
  • 做品牌折扣的网站百度推广的五大优势
  • 南宁比较有好的网站制作公司百度推广后台登录页面
  • 长沙企业网站排名优化windows优化大师和360哪个好
  • 珠海网站开发维护科技公司免费的网络推广渠道有哪些
  • wp建站系统微信营销管理软件
  • 本地打开WordPress慢百度seo优化分析
  • 适合友情链接的网站排名函数
  • 开发公司岗位设置广州seo招聘网
  • 国内web设计网站宣传推广
  • 深圳高端网站定制公司小时seo
  • wordpress主菜单下拉箭头怎么设置台州seo排名优化
  • 网站系统管理员模块关键词查找工具
  • 望江县建设局网站外贸seo推广招聘
  • 微信网站上传图片手机怎么制作网站
  • 简单做网站需要学什么搜索引擎有哪些网站
  • 网站备案信息加到哪里如何进行网站推广
  • 昭通网站制作aso优化技巧
  • 制作网站时怎样做滚动字幕新网站多久会被百度收录
  • 余姚物流做网站微信指数是搜索量吗
  • 怎样做网站轮播今日国内重大新闻事件
  • 想给大学做网站百度网盘搜索神器
  • jsp网站开发论文官方app下载安装
  • 关于机场建设的网站今日疫情最新情况
  • 网站域名注册服务商google浏览器官方
  • 通过网站开发工具怎么改自动跳网站百度指数有哪些功能
  • 可以发锚文本的网站百度搜索官方网站