【问题标题】:Replace image and javascript absolute paths through proxy_redirect in nginx通过 nginx 中的 proxy_redirect 替换图像和 javascript 绝对路径
【发布时间】:2014-06-18 18:18:02
【问题描述】:

我有一个场景如下。

Nginx 被用作 apache 服务器的反向代理,监听端口 8080。nginx 在端口 80 上运行。有一个 wsgi 应用程序正在由 apache 服务器运行。

现在,我在 nginx 配置中添加了一个 proxy_pass,这样无论对 localhost/ 的请求(nginx 端口是默认端口 80),它们都会被重定向到 localhost:8080。

这里是 nginx 配置文件的摘录:

    server {
       listen 80;
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;

       location <app_name> {
                proxy_pass http://localhost:8080/
                proxy_redirect http://localhost/ http://localhost:8080/
       }
    }

我添加了代理重定向来处理来自 apache 服务器的任何重定向,以便任何映射到 http://localhost/&lt;something&gt; 的请求都被重定向到 http://localhost:8080/&lt;something&gt;,因为应用程序的资源将在端口 8080 下可用。

现在,这里的问题是 wsgi 应用程序生成一个 html,其中图像和 javascript 位置路径是绝对路径,例如 /img/image.png 和 /js/javascript.js。现在,它们是 HTML 的一部分,不会发送任何带有完整 http:// 前缀的重定向,因此,服务器会尝试在 localhost/img 目录而不是 localhost:8080/img 目录中定位图像.

同样的一个肮脏的解决方法可能是将 /img 和 /js 目录也定义为服务器配置中的单独“位置”,并为它们指定 proxy_pass。但是这些目录的数量可能会更多,并且保持相同的目录可能会令人头疼。

有没有更清洁的方法?

这是指解决石墨问题Apache cannot serve graphite-web from URLs other than /

【问题讨论】:

    标签: redirect nginx apache2 reverse-proxy graphite


    【解决方案1】:

    如果代理应用程序(本例中为 Graphite 应用程序)无法配置为“从属”应用程序,最好将整个子域留给应用程序。

    或者你可以试试ngx_http_sub_module

    ...通过将一个指定的字符串替换为另一个来修改响应。

    作为示例,此代码会将所有 ':/localhost:8080/' 更改为 ':/localhost/app_name/':

    location <app_name> {
        # ...
        sub_filter ':/localhost:8080/' ':/localhost/app_name/';
    }
    

    请注意:

    此模块默认不构建,​​应使用 --with-http_sub_module 配置参数启用。

    但在大多数包系统中,nginx 已经构建了它的所有可选模块。只需检查您的版本是否内置了 sub_module

    nginx -V | grep sub_module
    

    在我的自制程序中,它给出了output like this

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多