1. 需求背景

  • 没有备案域名,国内建站只能通过IP:端口访问。
  • 国内共享服务器建站,IP可能会变动,无法记忆。

2. 流程图

UntitledDiagram.jpg

3. 实现

境外服务器

3.1 境外服务器安装宝塔,新建网站,进入网站管理,新建302重定向。
屏幕截图20240316164045.png

3.2 进入网站管理,点开配置文件,找到这一行。
屏幕截图20240316164213.png

3.3 进入文件管理,按照文件路径找到实际文件名。
此处为/www/server/panel/vhost/nginx/redirect/example.com/559316ecc798a86156ab578bc0f87dc1_example.com.conf

屏幕截图20240316164423.png

3.4 进入面板设置,打开IPv6和API,并设置白名单。
屏幕截图20240316164639.png

境内服务器

3.5 创建python脚本文件,填入以下内容,修改所有【中括号】内容。

vim test.py
import time
import hashlib
import requests
import os
import json

# 修改这些变量以符合你的需求
api_sk = '【你的宝塔API密钥】'
url = 'http://【IP地址】:【宝塔面板端口】/files?action=SaveFileBody'

# 获取当前Unix时间戳
request_time = str(int(time.time()))

# 计算request_token
hashed_api_sk = hashlib.md5(api_sk.encode('utf-8')).hexdigest()
raw_token = request_time + hashed_api_sk
request_token = hashlib.md5(raw_token.encode('utf-8')).hexdigest()

# 准备POST数据
url_to_request_first = 'http://4.ipw.cn'
response_first = requests.get(url_to_request_first)
if response_first.status_code == 200:
    received_data = response_first.text
else:
    print("IP获取失败,状态码:", response_first.status_code)
    received_data = ''

data = {
    'path': '【上面获取的文件路径如/www/server/panel/vhost/nginx/redirect/example.com/559316ecc798a86156ab578bc0f87dc1_example.com.conf】',
    'data': "#REWRITE-START\n        if ($host ~ '^【域名如example.com】'){\n            return 302 http://" + received_data + ":【国内建站端口】$request_uri;\n        }\n#REWRITE-END",
    'encoding': 'utf-8',
    'request_time': int(request_time),
    'request_token': request_token,
}

# 发送POST请求
if received_data:
    response = requests.post(url, data=data)
    print(response.text)

3.6 测试脚本

python3 test.py

3.7 配置定时任务,定时更新

crontab -e
*/30 * * * * python3 /path/to/test.py