设计一个网站(域名)的镜像
一、设计背景
假设你有一个经常去逛的海外网站,但是由于跨洋网络或者某种不可貌似的原因。你需要做一个 海外节点ip的代理,才能访问得到这个网站。但是可能某天发现这个方法也不太好使了,猜测可能原因是流量分析大数据系统可能对你访问的域名做了截获。另外这样访问的流量是需要你在客户端和服务端安装某种网络层代理工具。加上网络层代理软件如果被封了。所以能否绕开搭建天梯的步骤,而且你使用一个安全的域名(你拥有的域名)做网站镜像拷贝。
本文就是通过大家熟知的nginx来解决这个问题。
二、设计工具
这里需要你拥有一个你的一个境外节点(推荐香港节点,连接国内国外最好的桥梁),这个节点可以是任意Linux系统,能跑nginx就行。还需要你有个域名。这个域名的解析ip是这个境外节点。
开始啰!
三、反向代理配置proxy_pass
这里以CentOS7为例,先来安装下nginx。
yum install nginx
vim /etc/nginx/nginx.conf
先新增一个server配置如下,这个配置把所有访问http://[你的域名]的流量通过设置新的请求Host头,然后经过nginx的上游模块[新的域名]。这个新的域名就是你打算访问的网站。因为nginx的upstream模块是在香港节点访问【海外域名】,相当于香港用户访问海外网站,那当然是嗖嗖嗖地快!
server {
listen 80;
listen [::]:80;
server_name [你的域名];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#所有路径
location / {
proxy_pass http://[海外域名]/;
proxy_set_header Host [海外域名];
# You may need to uncomment the following line if your redirects are relative, e.g. /foo/ba
#proxy_redirect / /;
}
}
四、重定向到https
问题来了,当前https网站几乎已经普及了(这里强调国外,因为国外的https,ipv6普及率都超级高,相比国内来说)。所以国外很少有网站是通过http访问。但是人家也不限制你从http访问,他会用一个30x响应告诉你,请你访问Location响应头的url,https://[新域名]。
也就是说用第三节的配置,你其实不能访问到真实网站内容。
于是,我们加上了30x截获,重新再来一轮nginx的upstream请求。
server {
listen 80;
listen [::]:80;
server_name [你的域名];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#所有路径
location / {
proxy_pass http://[海外域名]/;
proxy_set_header Host [海外域名];
# You may need to uncomment the following line if your redirects are relative, e.g. /foo/ba
#proxy_redirect / /;
# 开始截获30x请求,到handle_redirect流程
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirect;
}
# 截获的进入这个流程,重新开始新一轮的proxy_pass,到指定的url
location @handle_redirect {
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
proxy_set_header Host [海外域名];
}
}
这里对30x请求进行了截获,并且截获的请求进行新一轮的proxy_pass重定向,这次重定向到Location标头带的URL(也就是https://[新的域名])。
五、内嵌url改写
好了,到这里你基本上可以访问到一个主页,这个主页的内容就是期望的方式得到的。接着你在这个主页挨个点链接。是不是又感觉哪里不对劲呢?是的,这样还有个问题,就是主页里面的内嵌url其实还是用海外那个域名。这里需要改成你自己的域名。
这里的sub_filter对网页内嵌url进行了改写。sub_filter_once 顾名思义就是最多匹配到一次,就结束任务。当然我们这里想要他把全部url都替换掉,所以选择了off。
server {
listen 80;
listen [::]:80;
server_name [你的域名];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#所有路径
location / {
proxy_pass http://[海外域名]/;
proxy_set_header Host [海外域名];
# You may need to uncomment the following line if your redirects are relative, e.g. /foo/ba
#proxy_redirect / /;
# 开始截获30x请求,到handle_redirect流程
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirect;
sub_filter "https://[海外域名]/" "http://[你的域名]";
sub_filter_once off;
}
# 截获的进入这个流程,重新开始新一轮的proxy_pass,到指定的url
location @handle_redirect {
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
proxy_set_header Host [海外域名];
}
}
- 用 Python 实现雪花效果
- CentOS6.8_Spark单机部署
- 3.2 Spark调度机制
- 正则表达式中零宽断言的用法
- Spark ReadmeApache Spark
- Apache Spark快速入门
- YARN & Mesos,论集群资源管理所面临的挑战
- Requests库作者Kenneth Reitz的另一神作!虚拟环境及包管理工具Pipenv!
- 你写的单例真的对吗
- TensorFlow layers模块用法
- Spark算子详解及案例分析(分类助记)
- Spark详解07广播变量BroadcastBroadcast
- TensorFlow验证码识别
- python selenium2 开发环境搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP递归算法的简单实例
- Yii2框架操作数据库的方法分析【以mysql为例】
- 使用OpenCV实现道路车辆计数的使用方法
- python中tab键是什么意思
- PHP实时统计中文字数和区别
- PHP单例模式实例分析【防继承,防克隆操作】
- Python基于network模块制作电影人物关系图
- tp5(thinkPHP5框架)使用DB实现批量删除功能示例
- 统计PHP目录中的文件数方法
- python json.dumps() json.dump()的区别详解
- Win10下用Anaconda安装TensorFlow(图文教程)
- TP5(thinkPHP框架)实现后台清除缓存功能示例
- PHP递归的三种常用方式
- python实现xlwt xlrd 指定条件给excel行添加颜色
- PHP解析url并得到url参数方法总结