【问题标题】:How to compensate for Nginx url rewrite in JavaScript?如何补偿 JavaScript 中的 Nginx url 重写?
【发布时间】:2012-10-12 10:54:18
【问题描述】:

我有几个 Flask 应用程序在 Nginx 反向代理后面运行。 URL 以 /demo/pipeline 开头的所有请求都转到侦听端口 7001 的 Flask 实例。我正在设置 X-Script-Name 标头,以便我的 Flask 后端可以根据 http://flask.pocoo.org/snippets/35/ 处理此根 URL。这让后端代码生成相对于 /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 反向代理,代码需要继续工作。

【问题讨论】:

    标签: javascript python nginx coffeescript flask


    【解决方案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 对象上出错。

    【讨论】:

    • 在哪里定义 app_root?我是否将其设置为Environment.globals
    • 我刚刚发现我可以在包含“/demo/pipeline”的模板中访问 request.headers['X-SCRIPT-NAME']。我认为使用它而不是定义 app_root 将是最好的方法,因为定义在 nginx 级别的一个地方。
    • @Maros:这确实是一个更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2011-05-18
    • 2023-03-13
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多