我在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反向代理,代码需要继续工作。
答案 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对象(而不是null
或undefined
),并且text
不会出错空的jQuery对象。