さくらのサーバをうちにあるサーバの死活管理に使おうと思ってうちの nginx に CORS 対応しようと思ったら半日失ったのでメモ

  • CORS?
    • Cross-Origin Resource Sharing
    • 以下の http header が関わってる(検索ワードとして使いましょう)
    • Access-Control-Allow-Origin
    • Access-Control-Allow-Headers
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Credentials
  • 変更前の conf
...
    location / {
        root /path/to/docroot;
        rewrite "^/hoge/$" /index.php?fuga=piyo last;
        try_files $uri $uri/ =404;
        index index.php index.htm;
        include /path/to/limit_except.conf;
        location /include/ {
            allow 127.0.0.1;
            deny all;
        }
    }
...
  • 変更後
...
    location / {
        root /path/to/docroot;
        rewrite "^/hoge/$" /checker.php?fuga=piyo last;
        try_files $uri $uri/ =404;
        index index.php index.htm;
        include /path/to/limit_except.conf;
        location /include/ {
            allow 127.0.0.1;
            deny all;
        }

        # add start
        if ($http_origin ~ (.*\.hoge\.com)) {
            set $cors 1;
        }
        if ($cors) {
            add_header Access-Control-Allow-Origin $http_origin always;
            add_header Access-Control-Allow-Headers 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';
            add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,PATCH,OPTIONS';
            add_header Access-Control-Allow-Credentials 'true';
        }
        # add end
    }
...

これで完成したかと思われた…
しかしさくらのサーバから GET を送ると引き続き Access-Control-Allow-Origin がないのでデータを処理できないと言われる…なぜだ

坊やではないので if が動いてるかどうかとかどのディレクティブが悪さをしているとか色々確認していたところ…
なんと諸悪の根源は

include /path/to/limit_except.conf;

だった。これ消したら動いた…
中身は

limit_except PUT DELETE MKCOL COPY MOVE OPTIONS PROPFIND PROPPATCH LOCK UNLOCK PATCH {
    allow all;
}

しか書いてないものなので何も悪いことないと思うんだけど…
とりあえずファイルの中身的にも何らの制限をかけてる状態じゃないので消して終わりということにした。

最初 If Is Evil {ex} 的なことかと思って奔走してたけど全然違ったので nginx こわい。
ちなみに最初のうちは if ($http_origin ~ (.*\.hoge\.com)) がちゃんと見れてないのかと思って log_format hoge "$http_origin" とかやって送られてきてる Origin を確認したりもしました。意味なかったけど nginx は内部変数をログに出せるのがよい(apache もできるのかもしれないけどよく知らないまま nginx に逃げてきてしまった)

よかったですね。

2017-05-13 18:54:04 (2017-05-14 17:05:05)