我用Nginx搭建了支持大部分网站的通用的镜像网站。
示例:https://github-com.ingke.net/trending 访问 Github
将要访问的网站域名的点改成小横杆,然后加上.ingke.net就好
更多例子:
https://zh-wikipedia-org.ingke.net/wiki/
Nginx配置文件
对于大多数网站中任何 HTML / JS / CSS / 文本里出现的 URL 都会被替换成代理域
会改写
<a href>
<img src>
<script src>
<link href>
JS 字符串里的 https://xxx
CSS 里的 url(...)
对于有些网站这样会导致样式丢失,比如github就是这样。于是只改写 <a href>,页面资源全部直连原站。有的网站如果不全部改写样式也会丢失,比如Bilibili。后者更常见,于是在白名单的网站只改写<a href> 的链接。
# HTTP 重定向到 HTTPS
server {
listen 80;
# ingke.net换成自己的域名
server_name ~^(?[^.]+)\.ingke\.net$;
# 重定向所有 HTTP 请求到 HTTPS
return 301 https://$host$request_uri;
}
# HTTPS 代理服务器
server {
listen 443 ssl http2;
# ingke.net换成自己的域名
server_name ~^(?[^.]+)\.ingke\.net$;
# SSL 证书配置
ssl_certificate /www/server/panel/vhost/ssl/ingke.net/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/ssl/ingke.net/privkey.pem;
# SSL 优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
access_log /var/log/nginx/proxy_access.log;
error_log /var/log/nginx/proxy_error.log info;
location / {
set_by_lua_block $backend_host {
local subdomain = ngx.var.subdomain
local real_host = subdomain:gsub("-", ".")
return real_host
}
proxy_pass https://$backend_host;
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_verify off;
proxy_set_header Host $backend_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Accept-Encoding "";
proxy_redirect off;
proxy_buffering off;
header_filter_by_lua_block {
local host = ngx.var.backend_host
-- 白名单:只改
local whitelist = {
["github.com"] = true,
}
local strategy = "full_rewrite"
for domain, _ in pairs(whitelist) do
if host == domain or host:match("%." .. domain .. "$") then
strategy = "rewrite_a"
break
end
end
ngx.ctx.strategy = strategy
}
body_filter_by_lua_block {
local strategy = ngx.ctx.strategy
local chunk = ngx.arg[1]
if not chunk or chunk == "" then
return
end
------------------------------------------------
-- A. 白名单站点:只改
------------------------------------------------
if strategy == "rewrite_a" then
chunk = chunk:gsub(
'(<a%s+[^>]*href=["\'])(https?://)([^/"\']+)([^"\']*)(["\'])',
function(prefix, scheme, domain, path, suffix)
-- 已经是代理域名,不处理
if domain:match("%.ingke%.net$") then
return prefix .. scheme .. domain .. path .. suffix
end
-- IP 地址不处理
if domain:match("^%d+%.%d+%.%d+%.%d+$") then
return prefix .. scheme .. domain .. path .. suffix
end
-- 真实域名 → 代理域名
local proxy_domain = domain:gsub("%.", "-") .. ".ingke.net"
return prefix .. "https://" .. proxy_domain .. path .. suffix
end
)
ngx.arg[1] = chunk
return
end
------------------------------------------------
-- B. 默认策略:全量改写
------------------------------------------------
chunk = chunk:gsub('(https?)://([a-zA-Z0-9][a-zA-Z0-9%-%.]*[a-zA-Z0-9])([/:?#%[%]])', function(scheme, domain, separator)
if domain:match("%.ingke%.net$") then
return "https://" .. domain .. separator
end
if domain:match("^%d+%.%d+%.%d+%.%d+") then
return scheme .. "://" .. domain .. separator
end
local proxy_domain = domain:gsub("%.", "-") .. ".ingke.net"
return "https://" .. proxy_domain .. separator
end)
chunk = chunk:gsub('(https?)://([a-zA-Z0-9][a-zA-Z0-9%-%.]*[a-zA-Z0-9])(["\'><%s])', function(scheme, domain, terminator) if domain:match("%.ingke%.net$") then return "https://" .. domain .. terminator end if domain:match("^%d+%.%d+%.%d+%.%d+") then return scheme .. "://" .. domain .. terminator end local proxy_domain = domain:gsub("%.", "-") .. ".ingke.net" return "https://" .. proxy_domain .. terminator end) chunk = chunk:gsub('//([a-zA-Z0-9][a-zA-Z0-9%-%.]*[a-zA-Z0-9])([/:?#"\'><%s%[%]])', function(domain, separator)
if domain:match("%.ingke%.net$") then
return "//" .. domain .. separator
end
if domain:match("^%d+%.%d+%.%d+%.%d+") then
return "//" .. domain .. separator
end
local proxy_domain = domain:gsub("%.", "-") .. ".ingke.net"
return "https://" .. proxy_domain .. separator
end)
ngx.arg[1] = chunk
}
}
}
文章评论