使用Google App Engine设置自定义“ A”资源记录,以避免重定向

时间:2018-06-19 14:41:08

标签: google-app-engine google-domain-api

我有一个Web服务托管在公共动态IP上的家用PC上。我也有一个由Google网域托管的域名(在本文中,我将其称为www.example.com)。

通过Google App Engine,我可以将动态IP存储在内存缓存中,并且一旦客户端指向myhome子域,它将被重定向到主机ip(例如myhome.example.com-> 111.111.1.100)。

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

<html>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    some code goes here
    <iframe>
        <html>
            <body>
                <h1>My preview!</h1>
                <script src="any source here"></script>
            </body>
        </html>
    </iframe>
</body>
</html>

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

enter image description here

是否可以使用Google App Engine或Domain API更新“ A”域记录?

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)

1 个答案:

答案 0 :(得分:1)

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

您可以通过向以下网址发出POST请求(也允许GET)来使用API​​手动执行更新: 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

注意:您还必须在请求中设置用户代理。通过上述网址进行测试时,网络浏览器通常会为您添加此代码。无论如何,发送到我们服务器的最终HTTP请求应如下所示:

HTTP查询示例: POST /nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4 HTTP / 1.1 主机:domains.google.com 授权:基本的base64编码的身份验证字符串用户代理:Chrome / 41.0 your_email@yourdomain.com