3

Nginxリバースプロキシの背後で実行されているFlaskアプリがいくつかあります。/ demo / pipelineで始まるURLを持つすべてのリクエストは、ポート7001でリッスンしているFlaskインスタンスに送信されます。Flaskバックエンドがhttp://flask.pocooに従ってこのルートURLを考慮できるように、X-Script-Nameヘッダーを設定しています。 .org / snippets /35/。これにより、バックエンドコードは/ demo/pipelineルートに相対的なURLを生成できます。たとえば、/ demo / pipeline / static/utils.jsです。

リクエストを/demo/pipelineアプリにルーティングするNginx構成の一部を次に示します。

server {

    listen 80;
    server_name localhost; 

    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_set_header X-Scheme $scheme;

    location / {

        proxy_set_header X-Script-Name /;
        proxy_pass http://localhost:7000;
    }

    location /demo/pipeline/ {

        proxy_set_header X-Script-Name /demo/pipeline;
        rewrite ^/demo/pipeline/(.*) /$1 break;
        proxy_pass http://localhost:7001;
    }

    ...
}

では、クライアント側でルートURLをどのように説明しますか?たとえば、私のjQueryAJAX呼び出しの1つを取り上げます。

    $.ajax
        type: 'PUT'
        url: '/subreddit/update'
        data: name: @subreddit
        error: -> $(elem)?.text val

このリクエストを/subreddit/updateではなく/demo/ pipeline / subreddit / updateに移動するにはどうすればよいですか?ルート名を変更するか、Nginxリバースプロキシを削除した場合でもコードが機能し続ける必要があるため、文字列'/ demo/pipeline'をハードコーディングしたくありません。

4

1 に答える 1

1

1つの方法は、メインスクリプトを含める前に、次のようなスクリプトをテンプレートに追加することです。

<script type="text/javascript">var APP_ROOT = {{ app_root|json_encode }};</script>

json_encode(フィルターとして設定さapp_rootれ、アプリケーションのルートURLとして定義されていると仮定します。)

次に、CoffeeScriptコードは次のようなことを実行できます。

$.ajax
    type: 'PUT'
    url: "#{APP_ROOT}/subreddit/update"
    data: name: @subreddit
    error: -> $(elem)?.text val

ちなみに、$jQueryで$(elem)?.text valあると仮定すると、役に立ちません。jQueryは、一致するものがない場合に(または$(elem).text valではなく)空のjQueryオブジェクトを返し、空のjQueryオブジェクトでエラーが発生しないため、同じように機能します。nullundefinedtext

于 2012-10-12T02:54:18.473 に答える