3

クロス オリジン リソース共有 (CORS) をサポートする JSON API を提供する NginX 経由でホストされる Rails3 アプリがあります。関連するヘッダーは、Rails アプリ経由ではなく、NginX 経由で追加する必要があります。

したがって、routes.rb にキャッチャーを追加して、OPTIONS プリフライト リクエストを取得しました。

match "*options", controller: "application", action: "options", constraints: { method: "OPTIONS" }

そして、対応するエンドポイントをアプリケーション コントローラーに追加しました。

def options
  render :text => "", :layout => false
end

動作します。ここで、NginX 用に広く開いた CORS 構成が必要です。

    server {
            listen 80;
            server_name localhost;
            passenger_enabled on;
            root /home/deployer/apps/fooapp/current/public;

            location /v1 {
                    if ($request_method = 'OPTIONS') {
                            add_header 'Access-Control-Allow-Origin' '*';
                            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                            add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-FooApp-Auth-Token';
                            add_header 'Access-Control-Max-Age' 1728000;
                            add_header 'Content-Type' 'text/plain charset=UTF-8';
                            add_header 'Content-Length' 0;
                            return 200;
                    }
                    if ($request_method = 'POST') {
                            add_header 'Access-Control-Allow-Origin' '*';
                            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                            add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-FooApp-Auth-Token';
                    }
                    if ($request_method = 'GET') {
                            add_header 'Access-Control-Allow-Origin' '*';
                            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                            add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-FooApp-Auth-Token';
                    }
            }
    }

OPTIONS リクエストには、応答に必要なすべてのヘッダーが含まれています。

curl -i -H'Accept: application/json' -H'Content-Type: application/json' -XOPTIONS 'http://api.fooapp.net/v1/api_session' -d'{"user":{"email":"demo@fooapp.net", "password":"somepassword"}}'

HTTP/1.1 200 OK
Server: nginx/1.2.3
Date: Sun, 02 Sep 2012 11:04:28 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-FooApp-Auth-Token
Access-Control-Max-Age: 1728000
Content-Type: text/plain charset=UTF-8
Content-Length: 0

しかし、たとえば実際の POST リクエストは 404 で失敗します。

curl -i -H'Accept: application/json' -H'Content-Type: application/json' -XPOST 'http://api.fooapp.net/v1/api_session' -d'{"user":{"email":"demo@fooapp.net", "password":"somepassword"}}'

HTTP/1.1 404 Not Found
Server: nginx/1.2.3
Date: Sun, 02 Sep 2012 11:06:19 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.2.3</center>
</body>
</html>

NginXログには次のように書かれています:

2012/09/02 13:06:19 [error] 2464#0: *3 open() "/home/deployer/apps/fooapp/current/public/v1/api_session" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "POST /v1/api_session HTTP/1.1", host: "api.fooapp.net"

私はNginXを初めて使用しますが、それが非常に軽量な構成であるだけでなく、広く開かれていることも知っています。基礎となるRailsアプリがリクエストされないように、NginXがこれらのリクエストをパブリック経由でルーティングしようとする理由がわかりません。すべてのリクエストが以前と同じようにアプリに渡されるように、どのように構成を変更する必要がありますが、CORS ヘッダーは追加されますか?

事前にThx

フェリックス

4

1 に答える 1

2

これは少し遅れていますが、同じ問題に遭遇したので、他の誰かを助けるかもしれません.

ロケーションブロック内でパッセンジャーを有効にする必要があります

location /{
     ...
     passenger_enabled on;
     ...
 }

これが役立つことを願っています。

于 2013-09-27T08:18:38.047 に答える