英文:
How to know which custom domain a request was made to with Cloud Run?
问题
我正在使用Google Cloud Run在Go中原型化一个智能链接服务。我需要知道调用我的Cloud Run服务时使用了哪个域名/主机名(例如,默认的.run.app,或多个自定义映射的域名)。
我创建了一个检查端点(/__hitcheck
),它以JSON格式返回当前HTTP请求的引用者、头部和URL。
我已经检查了我期望显示当前调用域的字段,但没有成功:
r.URL.String() = "/__hitcheck"
(我的测试端点)r.URL.Host = ""
请求头中也没有任何内容。
那么,我如何知道有人是直接从Cloud Run服务URL调用/__hitcheck
还是从多个自定义域名之一调用的呢?
经过编辑的JSON有效载荷:
{
"r.Header": {
"Accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
],
"Accept-Encoding": [
"gzip, deflate, br"
],
"Accept-Language": [
"en-US,en;q=0.9"
],
"Cookie": [
"...一些内容..."
],
"Early-Data": [
"1"
],
"Forwarded": [
"for=\"我的IP\";proto=https"
],
"Referer": [
"https://example.com/some-blog-post/"
],
"Sec-Ch-Ua": [
"\"Google Chrome\";v=\"107\", \"Chromium\";v=\"107\", \"Not=A?Brand\";v=\"24\""
],
"Sec-Ch-Ua-Mobile": [
"?0"
],
"Sec-Ch-Ua-Platform": [
"\"macOS\""
],
"Sec-Fetch-Dest": [
"document"
],
"Sec-Fetch-Mode": [
"navigate"
],
"Sec-Fetch-Site": [
"cross-site"
],
"Sec-Fetch-User": [
"?1"
],
"Traceparent": [
"一些请求ID"
],
"Upgrade-Insecure-Requests": [
"1"
],
"User-Agent": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
],
"X-Cloud-Trace-Context": [
"一些请求ID"
],
"X-Forwarded-For": [
"我的IP"
],
"X-Forwarded-Proto": [
"https"
]
},
"r.Referer()": "https://example.com/some-blog-post/",
"r.RequestURI": "/__hitcheck",
"r.URL": {
"Scheme": "",
"Opaque": "",
"User": null,
"Host": "",
"Path": "/__hitcheck",
"RawPath": "",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"r.URL.String()": "/__hitcheck"
}
英文:
I am prototyping a smart link service in Go using Google Cloud Run. I need to know which domain/hostname has been used to call my Cloud Run service (e.g., the default .run.app, or one of many custom mapped domains).
I created a check endpoint (/__hitcheck
) that returns the current HTTP request's referer, headers, and URL, as JSON.
I've checked fields I'd expect to show the current domain called, in vain:
r.URL.String() = "/__hitcheck"
(my test endpoint)r.URL.Host = ""
And nothing's in the request headers either.
So, how can I know if somebody called /__hitcheck
from the Cloud Run service URL directly or one of many custom domains?
The redacted JSON payload:
{
"r.Header": {
"Accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
],
"Accept-Encoding": [
"gzip, deflate, br"
],
"Accept-Language": [
"en-US,en;q=0.9"
],
"Cookie": [
"...some stuff..."
],
"Early-Data": [
"1"
],
"Forwarded": [
"for=\"MY IP\";proto=https"
],
"Referer": [
"https://example.com/some-blog-post/"
],
"Sec-Ch-Ua": [
"\"Google Chrome\";v=\"107\", \"Chromium\";v=\"107\", \"Not=A?Brand\";v=\"24\""
],
"Sec-Ch-Ua-Mobile": [
"?0"
],
"Sec-Ch-Ua-Platform": [
"\"macOS\""
],
"Sec-Fetch-Dest": [
"document"
],
"Sec-Fetch-Mode": [
"navigate"
],
"Sec-Fetch-Site": [
"cross-site"
],
"Sec-Fetch-User": [
"?1"
],
"Traceparent": [
"some request ID"
],
"Upgrade-Insecure-Requests": [
"1"
],
"User-Agent": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
],
"X-Cloud-Trace-Context": [
"some request ID"
],
"X-Forwarded-For": [
"MY IP"
],
"X-Forwarded-Proto": [
"https"
]
},
"r.Referer()": "https://example.com/some-blog-post/",
"r.RequestURI": "/__hitcheck",
"r.URL": {
"Scheme": "",
"Opaque": "",
"User": null,
"Host": "",
"Path": "/__hitcheck",
"RawPath": "",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"r.URL.String()": "/__hitcheck"
}
答案1
得分: 2
HTTP的Host
头部字段指定了请求发送到的服务器的主机和端口号。
我通过一个Swift Cloud Run实例进行了验证。点击下面的链接并向下滚动到host
头部字段。
Swift代码在GitHub上。类似的技术也适用于Cloud Run Go应用程序。
英文:
The HTTP Host
header specifies the host and port number of the server to which the request is being sent.
I verified that with a Swift Cloud Run instance. Click both links and scroll down to the host
header.
The Swift code is on GitHub. Similar techniques will work for a Cloud Run Go application.
答案2
得分: 0
在Go语言中,似乎是通过http.Request.Host
来指定主机,而不是通过头部或http.Request.URL.Host
来指定。
英文:
In Go, it seems like the host is specified in http.Request.Host
, rather than the headers or http.Request.URL.Host
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论