Nginx reverse proxy

nginxでリバースプロキシーを利用しようとしてちょっと詰まったのでメモ。

XHRリクエストでCross-Originなリクエストを作りたい! それもXHR2.0とかjsonpとかiframeハックではなくて、他人のサイトを読み込むようなリクエストを作りたい!! ということでnginxのリバースプロキシーでムリヤリ実現します。(最低な方法ですが)

/etc/nginx/conf.d/proxy.conf

proxy_redirect  off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
server {
    listen 80;
    server_name localhost;
    location ~ /http/(.*?)/(.*) {
            resolver 8.8.8.8;
            proxy_pass http://$1/$2;
            proxy_set_header X-Forwarded-Server $1;
    }
}

まだ理解できていない箇所が多いですが、これで実現することができました。

http://localhost/http/example.com

こんなURLにアクセスすると

http://example.com

の情報を取得することができるようになります。

肝は proxy_set_header X-Forwarded-Server \$1;としている箇所で、この行がないとIPで直接アクセスしてしまいvirtualhostで切り分けているようなサーバーに対応できなくなります。 でも、これで何で上手くいったかは不明です。

server名が上手く渡せてない感じがすると直感で付けたら上手くいってしまいました。

nginxが初めてということもあって、細々と分からない項目多いですね。 この辺りもう少し調べて覚えようかと思います。

TODO:

  • proxy_set_headerの内容調べる
  • nginxでのセキュリティ対策を調べる
  • 呼び出し元のHTML以外から呼ばれないように対策を取る(踏み台対策)