【发布时间】:2024-01-21 08:02:01
【问题描述】:
我目前正在开发一个 Web 应用程序(在 golang 中),它将用作其他内部应用程序(在 docker 容器中运行)的主要门户。这个 Web 应用程序应该简单地提供一个 HTML 页面,其中导航栏位于顶部,页面的其余部分将是一个 IFrame。在导航栏上,我们有多个链接,它们将更改 IFrame 的来源。重要的是要知道导航栏上的链接是动态创建的。
我很快就遇到了 Iframe 无法显示其他内部应用程序的问题,因为 Same-Origin-Policy 会阻止所有内容。为了解决这个问题,我认为在 golang 中实现我自己的反向代理可能是个好主意。
package main
import (
"fmt"
"net/http"
"net/http/httputil"
"net/url"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<html><body><iframe src=\"/\" width=\"100%\" height=\"100%\"/></body></html>")
}
func proxyHandle(r *http.Request) {
r.Host = "google.com"
r.URL.Host = r.Host
r.URL.Scheme = "http"
}
func main() {
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: "google.com",
})
proxy.Director = proxyHandle
http.Handle("/", proxy)
http.HandleFunc("/index", handler)
http.ListenAndServe(":8080", nil)
}
我仍然收到 SOP 错误消息。我现在基本上有两个问题:
- 这是正确的方法吗?还是有更好的方法来做到这一点?
- 我不明白这里发生了什么。在我看来,请求将被发送到我的应用程序,然后 HTML 将在响应中。浏览器注意到 iframe 并请求“/”。这个 GET 请求到达我的应用程序,然后应该转发到 google.com。响应应该返回到我的应用程序,然后从我的应用程序返回到客户端。这是正确的吗?
【问题讨论】:
标签: http iframe go reverse-proxy same-origin-policy