crystal-lee commented on issue #6916:
URL: https://github.com/apache/apisix/issues/6916#issuecomment-1133561098

   This is the code。The request do not be forwarded to the upstream, but I must 
set a upstream?
   
   ```
   func (p CBFTransfer) Filter(conf interface{}, w http.ResponseWriter, r 
pkgHTTP.Request) {
        //跳转
        Redirect(w, r, "http://www.baidu.com";, http.StatusMovedPermanently)
   }
   ```
   ```
   func Redirect(w http.ResponseWriter, r pkgHTTP.Request, url string, code 
int) {
        log.Infof("redirect to %s", url)
        if u, err := urlpkg.Parse(url); err == nil {
                // If url was relative, make its path absolute by
                // combining with request path.
                // The client would probably do this for us,
                // but doing it ourselves is more reliable.
                // See RFC 7231, section 7.1.2
                if u.Scheme == "" && u.Host == "" {
   
                        oldpath := gconv.String(r.Path())
                        if oldpath == "" { // should not happen, but avoid a 
crash if it does
                                oldpath = "/"
                        }
   
                        // no leading http://server
                        if url == "" || url[0] != '/' {
                                // make relative path absolute
                                olddir, _ := path.Split(oldpath)
                                url = olddir + url
                        }
   
                        var query string
                        if i := strings.Index(url, "?"); i != -1 {
                                url, query = url[:i], url[i:]
                        }
   
                        // clean up but preserve trailing slash
                        trailing := strings.HasSuffix(url, "/")
                        url = path.Clean(url)
                        if trailing && !strings.HasSuffix(url, "/") {
                                url += "/"
                        }
                        url += query
                }
        }
   
        h := w.Header()
   
        // RFC 7231 notes that a short HTML body is usually included in
        // the response because older user agents may not understand 301/307.
        // Do it only if the request didn't already have a Content-Type header.
        _, hadCT := h["Content-Type"]
   
        h.Set("Location", hexEscapeNonASCII(url))
        if !hadCT && (r.Method() == "GET" || r.Method() == "HEAD") {
                h.Set("Content-Type", "text/html; charset=utf-8")
        }
        w.WriteHeader(code)
   
        // Shouldn't send the body for POST or HEAD; that leaves GET.
        if !hadCT && r.Method() == "GET" {
                body := "<a href=\"" + htmlEscape(url) + "\">" + 
http.StatusText(code) + "</a>.\n"
                fmt.Fprintln(w, body)
        }
   }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@apisix.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to