将 nginx 设置为 Github 页面前端,启用 https

Setup nginx as Github Pages frontend, with https enabled

我想为 Github 页面使用自定义域,并使用我自己的证书(不是 CloudFlare 证书)启用 HTTPS。

根据 Github Pages 说明,第一部分是通过在项目根文件夹和 DNS 中设置 CNAME 来完成的,但这种方式不支持 HTTPS:https://example.github.io 自定义域 example.com 只能在 http://example.com 中访问,https://example.com 将无法使用。

于是我想到了nginx反向代理:去掉CNAME文件和DNS设置,让3个链接共存,重定向http自定义域到https一个,转发https一个请求到github.io地址。

然而,结果并不完美:主页和css(在/css/main.css!)加载正确,所有链接显示正常,但点击它们会导致301 并重定向到 github.io.

我的nginx版本是1.9.5,80端口的配置:

server {
    listen 80;
    server_name myblog.com;
    return 301 https://$server_name$request_uri;
}

对于 443:

server {
    listen 443 ssl http2;
    server_name myblog.com;
    ssl_certificate /etc/nginx/ssl/orz.crt;
    ssl_certificate_key /etc/nginx/ssl/orz.key;
    add_header Strict-Transport-Security max-age=31536000;

    location / {
        proxy_pass https://example.github.io;
        proxy_set_header Host example.github.io;
    }
}

通过添加 2 行修复:

proxy_redirect https://example.github.io https://example.com;
proxy_redirect http://example.github.io https://example.com;

顺便说一句,如果您想在 Github 页面上托管 Jekyll/Ghost,请确保您帖子的永久链接以 / 结尾,否则将花费另外 301..

如果使用 Jekyll,在 server 块上为 css 文件添加服务器端推送:

add_header Link '</css/main.css>; rel=preload; as=stylesheet';