如何在JavaScript中补偿Nginx url重写?

时间:2012-10-11 18:22:02

标签: javascript python nginx coffeescript flask

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

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

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;
    }

    ...
}

现在如何在客户端对root 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反向代理,代码需要继续工作。

1 个答案:

答案 0 :(得分: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 val也可以,因为jQuery在没有匹配的情况下返回一个空的jQuery对象(而不是nullundefined),并且text不会出错空的jQuery对象。