我在端口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缺少一些配置参数,你能指出它吗?
答案 0 :(得分:0)
nginx和图像都表现正常,代理正在返回html,问题是tomcat服务器认为它是根,所以它返回相对于root的所有资产,你可以通过几种方式解决这个问题
/service
更改为子域service.domain.com
,这样资产就会真正位于根目录中。以某种方式配置tomcat服务器以返回相对于/service
文件夹的所有链接,一种简单的方法是在head
标记内添加一个基础
<base href='http://domain.com/service'>
这样,网址都是绝对的,但这只会使网址在该代理下运行
您可以告诉nginx自己添加该标头,而不是修改您的tomcat应用程序,通过使用sub_filter在返回的html中进行一些替换,它将插入head
内部标签
sub_filter '</head>' '<base href='$scheme://$server_name/service></head>';