cover

Github Pages でのリバースプロキシによるクロスドメイン対応実践

sorcererxw

WebアプリをGithub Pages(以下、gpと略称)にデプロイすることは非常に便利でエレガントですが、アクセスインターフェースのクロスドメイン問題に直面することになります。

解決策

通常、私たちはドメイン名を直接nginxサーバーに解決し、nginxのリバースプロキシを通じて、フロントエンドのAPIパスをAPIサーバーにプロキシします。一方、プロジェクトをgp上にデプロイする場合は、ドメイン名を直接gpサーバーに解決する必要があります。これにより、両者の間で衝突が発生し、追加の設定が必要になります。そこで、ドメイン名を直接nginxに解決し、nginxを通じてフロントエンドをgpに、APIをバックエンドにプロキシすることにしました。しかし、この方法ではgpの設定ルールに従っておらず、gpのenforce https機能を有効にすることはできませんが、このリダイレクトのステップは直接nginx上で実装することができます。

実践

準備作業

まず、サーバーを用意し、nginxをインストールして起動します。フロントエンドに設定する必要があるドメイン名 <code>example.com</code> をこのサーバーに解決させます。さらに、バックエンドサーバーを適切に設定し、ドメイン名の解決も行います。たとえば <code>api.example.com</code> のようにします。

デプロイ gh

参照私の以前の記事でghをデプロイし、カスタムドメイン欄にexample.comを入力してください。解析アドレス時にghに解析されなかったため、Enforce Httpsを選択できない状態であり、現在アクセスもできません。

nginx のリバースプロキシを設定する

server
{ 
    listen 80;
    server_name example.com; # 填上自己的域名
    location /api { # 配置前端 api 的路径
        proxy_pass https://api.example.com/; # 填上要转发的 api 服务器地址
        # 这里有一个需要注意的地方如果填的是 https://api.xxxx.com (末尾无斜杠)
        # 那么, 当前端访问 xxxx.com/api/target 时
        # nginx 会将请求转发到 https://api.xxxx.com/api/target
        # 而如果填的是 https://api.xxxx.com/
        # 那么, 当前端访问 xxxx.com/api/target 时
        # nginx 会将请求转发到 https://api.xxxx.com/target  
    }
    location / {
        proxy_redirect off;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        proxy_pass https://example.github.io;
        # 填上你的 gp 的二级域名, 比如我的是 sorcererxw.github.io
    }
    access_log /var/log/nginx/sorcererxw.com_access.log;
}

では、nginx をリロードしましょう。

nginx -s reload

この時点で、example.com にアクセスすると、アクセス可能になり、フロントエンドから直接 API インターフェースにアクセスすることもできます。原理としては、フロントエンドのトラフィックを直接 example.github.io に転送しているものの、アドレスバーに表示されるドメイン名を通じて、GitHub は対応するフロントエンドページを表示します。

Https リダイレクトの設定

最も便利な方法は、letsencrypt の certbot を直接使用して設定することです。https://certbot.eff.org/ に従ってインストールしてください。

certbot --nginx

忘れずに https へのリダイレクトを選択してください。