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

问题描述 投票:1回答:2

我的情况如下。

[Nginx被用作监听8080端口的apache服务器的反向代理。nginx在80端口运行。该apgi服务器正在运行一个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服务器的所有重定向,因此,由于应用程序的资源将在端口8080下可用,因此映射到http://localhost/<something>的任何请求都将重定向到http://localhost:8080/<something>

现在,这里的问题是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
2个回答
0
投票

如果不能将代理的应用程序(在本例中为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


0
投票

page帮助我解决了类似的问题。大声笑刚意识到这是5岁。

我用这个来确保我的文件不会是494。

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://host:port;
}

location /myapp {

}
© www.soinside.com 2019 - 2024. All rights reserved.