使用 google 应用引擎设置自定义 "A" 资源记录以避免重定向

Set custom "A" resource record with google app engine to avoid redirection

我在 public 动态 ip 上的家用 PC 上托管了一个网络服务。我还有一个由 google 域托管的域名(我将在此 post 中称为 www.example.com)。

通过 Google App Engine 我可以将动态 IP 存储在 memcache 上,一旦客户端指向 myhome 子域,它将被重定向到主机 ip(例如 myhome.example.com -> 111.111 .1.100).

这是我在 App Engine 上的 python 代码 运行:

import json
from webapp2 import RequestHandler, WSGIApplication
from google.appengine.api import memcache

class MainPage(RequestHandler):
    # Memcache keys
    key_my_current_ip = "my_current_ip"

    def get(self):
        response_text = "example.com is online!"
        # MyHome request
        if (self.request.host.lower().startswith('myhome.example.com') or
            self.request.host.lower().startswith('myhome-xyz.appspot.com')):
            my_current_ip = memcache.get(self.key_my_current_ip)
            if my_current_ip:
                url = self.request.url.replace(self.request.host, my_current_ip)
                # move to https
                if url.startswith("http://"):
                    url = url.replace("http://", "https://")
                return self.redirect(url, True)
            response_text = "myhome is offline!"
        # Default site
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write(response_text)

    def post(self):
        try:
            # Store request remote ip
            body = json.loads(self.request.body)
            command = body['command']
            if command == 'ping':
                memcache.set(key=self.key_my_current_ip, value=self.request.remote_addr)
        except:
            raise Exception("bad request!")

app = WSGIApplication([('/.*', MainPage),], debug=True)

我发现,通过添加 "A" 域记录,myhome.example.com 将直接指向该 ip 而无需重定向它。

有什么方法可以使用 Google App Engine 或域 API 更新 "A" 域记录?

def post(self):
    try:
        # Store request remote ip
        body = json.loads(self.request.body)
        command = body['command']
        if command == 'ping':
            **--> UPDATE "A" Record with this IP: <self.request.remote_addr>**
    except:
        raise Exception("bad request!")

正如 google 所述,您可以使用 https POST 来实现此目的。

您可以使用 API 手动执行更新,方法是向以下 url 发出 POST 请求(也允许 GET): https://domains.google.com/nic/update

API 需要 HTTPS。这是一个示例请求: https://username:password@domains.google.com/nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4

注意:您还必须在请求中设置用户代理。 Web 浏览器通常会在通过上述 url 进行测试时为您添加此内容。在任何情况下,发送到我们服务器的最终 HTTP 请求应该如下所示:

示例 HTTP 查询: POST /nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4 HTTP/1.1 主持人:domains.google.com 授权:基本 base64-encoded-auth-string 用户代理:Chrome/41.0 your_email@yourdomain.com