通过nginx中的proxy_redirect替换图像和javascript绝对路径

时间:2014-06-18 18:18:03

标签: redirect nginx apache2 reverse-proxy graphite

我的情况如下。

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

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

以下是nginx conf文件的摘录:

    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/<something>的任何请求都被重定向到http://localhost:8080/<something>,因为应用程序的资源将在端口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 /

中的问题

1 个答案:

答案 0 :(得分:0)

如果代理应用程序(在这种情况下为Graphite应用程序)无法配置为&#34; slave&#34;应用程序,最好将整个子域备用到应用程序中。

或者您可以尝试ngx_http_sub_module

  

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

作为示例,此代码将更改所有&#39;:/ localhost:8080 /&#39;到&#39;:/ localhost / app_name /&#39;:

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