Nginx反向代理无法隧道传输文件请求

时间:2015-02-21 01:36:41

标签: nginx reverse-proxy

我在端口2211上运行Tomcat内的应用程序,一切都很顺利。但是,每当有人浏览site.com/service时,我都希望提供此应用程序,为此我想出了这个Nginx代理传递设置。

  location /service {
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-Ssl     on;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Frame-Options     SAMEORIGIN;

    proxy_pass          https://127.0.0.1:2211;
  }

但是当我浏览site.com/service时,我只能用纯HTML看到我的码头应用程序。出于某种原因,即使Tomcat上存在所有文件,浏览器也会收到所有文件的404回复。

我已经查看了浏览器如何请求该文件,例如:

<img src="/themes/logo.png">

site.com/service/themes/logo.png正在询问此图片而不是site.com/themes/logo.png处的请求,这显然不起作用,因此找不到404。所有其他文件也是如此,它应该在site.com/service处查找,而不是在根文件夹site.com上查找。

当然Nginx缺少一些配置参数,你能指出它吗?

1 个答案:

答案 0 :(得分:0)

nginx和图像都表现正常,代理正在返回html,问题是tomcat服务器认为它是根,所以它返回相对于root的所有资产,你可以通过几种方式解决这个问题

  1. 将子文件夹/service更改为子域service.domain.com,这样资产就会真正位于根目录中。
  2. 以某种方式配置tomcat服务器以返回相对于/service文件夹的所有链接,一种简单的方法是在head标记内添加一个基础

    <base href='http://domain.com/service'>
    

    这样,网址都是绝对的,但这只会使网址在该代理下运行

  3. 您可以告诉nginx自己添加该标头,而不是修改您的tomcat应用程序,通过使用sub_filter在返回的html中进行一些替换,它将插入head内部标签

    sub_filter '</head>' '<base href='$scheme://$server_name/service></head>';