我有几个Flask应用程序运行在Nginx反向代理之后。 所有以/ demo / pipeline开头的URL请求都将转到一个监听端口7001的Flask实例。我设置了X-Script-Name头,以便我的Flask后端可以根据http://flask.pocoo .org / snippets / 35 / 。 这可以让后端代码生成相对于/ demo /pipe道根目录的URL。 例如/demo/pipeline/static/utils.js。
下面是我的一个Nginxconfiguration,它将请求路由到/ 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'这个string,因为如果我改变路由名称或者移除Nginx反向代理,代码需要继续工作。
一种方法是在包含主脚本之前将这样的脚本添加到模板中:
<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对象(而不是null
或undefined
),当没有匹配, text
不会错误的空jQuery对象。