Wikipedia全域恢复访问指南
发表于 ,已有 0 条评论,总计 1183 次阅读 | 点我进行简繁转换

Wikipedia全域恢复访问指南

发表于 | 已有 0 条评论,总计 1183 次阅读

在所有之前的

声明:本文仅为丰富知识的交流与学习途径,我不提供 Wikipedia 以外的其他网站指导。
请勿在中国大陆公网上公开自己搭建的反代站点,你可能会有随时遭到审查的风险。如果您因为此种原因导致种种问题,我不负任何责任。

使用本文所描述的方法,你可以访问 Wikipedia 各个语言站、登录并编辑,那么,让我们开始吧。

Wikipedia-logo-v2@2x


Wikipedia 全域恢复访问指南

本文主要参考自 神代綺凜 - 真·反代P站恢复直接访问指南Mashiro - PIXIV网页版及客户端访问恢复指南 ,我只是站在了巨人的肩膀上才能手抵星辰。

准备工作

  1. 境外主机或 VPS
  2. 属于你自己的域名,也就是可以自由设置 DNS 解析记录的域名
  3. 与你域名相符的并且支持通配符的 SSL 证书,如 Let's Encrypt

在后文中,均以三级域domain.example.com作为示例来反代访问 Wikipedia。

需要使用的域及其 DNS 解析记录

现在假定你将使用一个正在使用的域名,并且不想影响该域名的其他服务,那么你应该使用三级域domain.example.com,下文均以wiki.example.com作为示例,请灵活替换。

你需要添加以下域的 DNS 解析记录:

wiki.example.com
*.wiki.example.com
*.wiki-m.example.com

开始配置工作

注意:这里我不阐述 SSL 证书的获取以及后文将要使用的 Nginx 服务器的编译及安装过程。

Nginx 服务器的配置

将以下内容灵活替换后作为 Nginx 的虚拟主机文件,这里使用三级域wiki.example.com作为示例。 但请注意,这并不是本站实际使用的现行配置
#--------------------------------------------------------
#-    _       __   ___   ____         WikiMirror        -
#-   / \   _ _\ \ / (_) / ___|  ___ _ ____   _____ _ __ -
#-  / _ \ | '_ \ V /| | \___ \ / _ \ '__\ \ / / _ \ '__|-
#- / ___ \| | | | | | |  ___) |  __/ |   \ V /  __/ |   -
#-/_/   \_\_| |_|_| |_| |____/ \___|_|    \_/ \___|_|   -
#--------------------------------------------------------
upstream wiki-IPAddress {
  #在你的主机上使用`ping www.wikipedia.org`命令,用得到的 IP 地址替换下行的 127.0.0.1。
    server 127.0.0.1:443;
    keepalive 300;
}
server {
    listen       443 ssl http2;
    server_name  ~^([^.]+)\.wiki.example\.com$;

  #这里是 SSL 证书配置块,请根据自己的实际情况调整,在下个 server 块将省略,但不要忘记在各个包含 listen 443 的 server 块中加入。
    ssl_buffer_size            4k;
    ssl_certificate            /root/ca/ecc.fullchain.example.com.crt;
    ssl_certificate_key        /root/ca/ecc.example.com.key;
    ssl_ciphers                ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers  on;
    ssl_protocols              TLSv1.2 TLSv1.3;
    ssl_session_cache          shared:SSL:10m;
    ssl_session_tickets        on;
    ssl_session_timeout        1d;
    ssl_stapling               on;
    ssl_stapling_verify        on;
    ssl_trusted_certificate    /root/ca/ecc.fullchain.example.com.crt;
    add_header                 Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
    add_header                 X-Content-Type-Options nosniff;
    add_header                 X-Frame-Options "SAMEORIGIN" always;
    add_header                 X-Xss-Protection "1; mode=block";
    add_header                 AnYi-Mirror-Site-public "Config modified at 2019-11-05";
  #这里是 SSL 证书配置块,请根据自己的实际情况调整,在下个 server 块将省略,但不要忘记在各个包含 listen 443 的 server 块中加入。

    set       $domain $1;

    if ($http_user_agent ~* "Android|BlackBerry|iPhone|iPod|Mini|Mobile|Smartphone|Symbian|Touch|UCWEB|WAP|Windows Phone|^$) {
        rewrite ^ https://$domain.wiki-m.example.com$request_uri? redirect;
    }

  #这里阻止搜索引擎蜘蛛收录站点,请不要去掉,在下个 server 块将省略,但不要忘记在各个 server 块中加入。
    if ($http_user_agent ~* "Bot|Spider|BingPreview|Feedfetcher-Google|ia_archiver|MBCrawler|Mediapartners-Google|MSNot-media|Teoma|Yahoo! Slurp|baidu.sogo.uc.Chrome/36|com.alibaba.android.rimet|^$") {
        return 403;
    }
  #这里阻止搜索引擎蜘蛛收录站点,请不要去掉,在下个 server 块将省略,但不要忘记在各个 server 块中加入。

    location ~ .* {
        proxy_pass           https://wiki-IPAddress;
        proxy_cookie_domain  wikipedia.org wiki.example.com;
        proxy_cookie_domain  m.wikipedia.org wiki-m.example.com;
        proxy_redirect       https://$domain.wikipedia.org/ /;
        proxy_set_header     Accept-Encoding "";
        proxy_set_header     Host $domain.wikipedia.org;
        proxy_set_header     Referer $http_referer;
        proxy_set_header     User-Agent $http_user_agent;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     X-Forwarded-Proto https;
        proxy_set_header     X-Real-IP $remote_addr;
        sub_filter           ".wikipedia.org" ".wiki.example.com";
        sub_filter_once      off;
        sub_filter_types     *;
    }
}

server {
    listen       443 ssl http2;
    server_name  wiki.example.com;

    if ($http_user_agent ~* "Android|BlackBerry|iPhone|iPod|Mini|Mobile|Smartphone|Symbian|Touch|UCWEB|WAP|Windows Phone|^$) {
        rewrite ^ https://wiki-m.example.com$request_uri? redirect;
    }

    location / {
        proxy_pass           https://wiki-IPAddress;
        proxy_cookie_domain  wikipedia.org wiki.example.com;
        proxy_cookie_domain  m.wikipedia.org wiki-m.example.com;
        proxy_redirect       https://www.wikipedia.org/ /;
        proxy_set_header     Accept-Encoding "";
        proxy_set_header     Host www.wikipedia.org;
        proxy_set_header     Referer $http_referer;
        proxy_set_header     User-Agent $http_user_agent;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     X-Forwarded-Proto https;
        proxy_set_header     X-Real-IP $remote_addr;
        sub_filter           ".wikipedia.org" ".wiki.example.com";
        sub_filter_once      off;
        sub_filter_types     *;
    }
}

server {
    listen       443 ssl http2;
    server_name  www.wiki.example.com;

    rewrite ^ https://wiki.example.com$request_uri? redirect;
}

server {
    listen       443 ssl http2;
    server_name  ~^([^.]+)\.wiki-m.example\.com$;

    set       $domain $1;

    if ($http_user_agent !~* "Android|BlackBerry|iPhone|iPod|Mini|Mobile|Smartphone|Symbian|Touch|UCWEB|WAP|Windows Phone|^$) {
        rewrite ^ https://$domain.wiki.example.com$request_uri? redirect;
    }

    location ~ .* {
        proxy_pass           https://wiki-IPAddress;
        proxy_cookie_domain  wikipedia.org wiki.example.com;
        proxy_cookie_domain  m.wikipedia.org wiki-m.example.com;
        proxy_redirect       https://$domain.m.wikipedia.org/ /;
        proxy_set_header     Accept-Encoding "";
        proxy_set_header     Host $domain.m.wikipedia.org;
        proxy_set_header     Referer $http_referer;
        proxy_set_header     User-Agent $http_user_agent;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     X-Forwarded-Proto https;
        proxy_set_header     X-Real-IP $remote_addr;
        sub_filter           ".wikipedia.org" ".wiki-m.example.com";
        sub_filter_once      off;
        sub_filter_types     *;
    }
}

server {
    listen       443 ssl http2;
    server_name  wiki-m.example.com;

    if ($http_user_agent !~* "Android|BlackBerry|iPhone|iPod|Mini|Mobile|Smartphone|Symbian|Touch|UCWEB|WAP|Windows Phone|^$) {
        rewrite ^ https://wiki.example.com$request_uri? redirect;
    }

    location / {
        proxy_pass           https://wiki-IPAddress;
        proxy_cookie_domain  wikipedia.org wiki.example.com;
        proxy_cookie_domain  m.wikipedia.org wiki-m.example.com;
        proxy_redirect       https://www.wikipedia.org/ /;
        proxy_set_header     Accept-Encoding "";
        proxy_set_header     Host www.wikipedia.org;
        proxy_set_header     Referer $http_referer;
        proxy_set_header     User-Agent $http_user_agent;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     X-Forwarded-Proto https;
        proxy_set_header     X-Real-IP $remote_addr;
        sub_filter           ".wikipedia.org" ".wiki-m.example.com";
        sub_filter_once      off;
        sub_filter_types     *;
    }
}

server {
    listen       443 ssl http2;
    server_name  www.wiki-m.example.com;

    rewrite ^ https://wiki-m.example.com$request_uri? redirect;
}

server {
    listen       80;
    server_name  ~^([^.]+)\.example\.com$;
    server_name  ~^([^.]+)\.wiki.example\.com$;
    server_name  ~^([^.]+)\.wiki-m.example\.com$;

    add_header  X-Content-Type-Options nosniff;
    add_header  X-Frame-Options "SAMEORIGIN" always;
    add_header  X-Xss-Protection "1; mode=block";
    add_header  AnYi-Mirror-Site-public "Config modified at 2019-11-05";

    rewrite ^ https://$http_host$request_uri? permanent;
}

以上配置应用后,访问wiki.example.com即可看到 Wikipedia 主站首页。

使用 Cloudflare 等 CDN 服务隐藏真实 IP

虽然使用 Cloudflare 等 CDN 服务可以隐藏真实 IP 并可以不用在意源服务器是否支持 HTTPS,但请注意,Cloudflare 是不支持泛域名下的 CDN 记录的,这意味着你只能手动或使用 API 去添加你所需站点的 DNS 解析记录(除主站外,维基百科有 298 个语言分站)。如果你不使用全新域名,你还需要为每个语言分站添加“桌面版”与“移动版”的DNS解析记录。

写在最后

授人以鱼不如授人以渔,但如果连鱼都没见过就要另当别论了。本文不是面向初次接触 Nginx 服务器的人而写的,如果照搬照抄,Nginx 服务器可是会丢你 Error 的(笑

附上我使用的nginx.conf配置节选。参考运用,会获得更好的性能。

events {
        accept_mutex  off;
        multi_accept  on;
        use           epoll;
}

http {
        client_header_buffer_size      4k;
        default_type                   application/octet-stream;
        keepalive_timeout              300s 300s;
        keepalive_requests             65535;
        send_timeout                   10s;
        sendfile                       on;
        tcp_nodelay                    on;
        tcp_nopush                     on;
        types_hash_max_size            2048;
        server_tokens                  off;
        server_names_hash_bucket_size  64;
        server_name_in_redirect        off;

        gzip on;
        gzip_comp_level  9;
        gzip_buffers     32 4k;
        gzip_disable     "msie6";
        gzip_min_length  1024;
        gzip_static      on;
        gzip_types       application/json application/x-font-ttf application/x-httpd-php application/x-javascript application/xml application/xml+rss application/vnd.ms-fontobject font/opentype image/jpeg image/gif image/png image/svg+xml image/x-icon text/css text/javascript text/plain text/xml;
        gzip_vary        on;

        open_file_cache_errors    on;
        open_file_cache           max=100000 inactive=20s;
        open_file_cache_min_uses  2;
        open_file_cache_valid     30s;
}

通过我给出的配置,你可以获得 MySSL 的 A+ 级评价,具有 TLS1.3HTTP2HSTSGzip等新特性。

我所做的只是一个抛砖引玉的工作,你可以利用这种方法,恢复访问 Wikibooks、Wiktionary、Google Scholar 或是 Pixiv 等其他网站。


如果你恰巧阅读到了这篇指南,并有通过搜索引擎解决不了的问题,请使用邮件与我联系。

本文头图:ほぼゆかれいむ

本文二维码

评论已关闭