3

我有几个 Flask 应用程序在 Nginx 反向代理后面运行。URL 以 /demo/pipeline 开头的所有请求都转到侦听端口 7001 的 Flask 实例。我正在设置 X-Script-Name 标头,以便我的 Flask 后端可以根据http://flask.pocoo处理此根 URL .org/snippets/35/。这让后端代码生成相对于 /demo/pipeline 根目录的 url。例如 /demo/pipeline/static/utils.js。

这是我的 Nginx 配置的一部分,它将请求路由到 /demo/pipeline 应用程序:

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?以我的一个 jQuery AJAX 调用为例:

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

如何让这个请求转到 /demo/pipeline/subreddit/update 而不是 /subreddit/update?我不想硬编码字符串“/demo/pipeline”,因为如果我更改路由名称或删除 Nginx 反向代理,代码需要继续工作。

4

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是没用的;它也可以这么说,因为当没有匹配项时$(elem).text valjQuery 返回一个空的 jQuery 对象(而不是nullor ),并且不会在空的 jQuery 对象上出错。undefinedtext

于 2012-10-12T02:54:18.473 回答