我有一个在nginx后面运行的struts2 Web应用程序模块。该应用程序在专用网络中运行,但我们的客户端通过互联网请求访问,因此打开了一个端口。
我的问题如下。我有一些已执行的操作,然后使用redirectAction转发到另一个标准应答操作。这样做是为了在json中编写标准答案的单一操作。不幸的是,重定向动作的响应头中的位置已清除端口 - 我猜nginx会这样做 - 因此重定向错过了,因为它没有端口。
我的nginx管理员说他无法触摸特定模块的nginx重定向,无论是全部还是全部。
有没有人知道是否有办法让struts redirectAction在相对路径上工作,而不是绝对路径?我唯一的想法是,我将尝试创建redirectAction实现的自定义变体 - org.apache.struts2.dispatcher.ServletActionRedirectResult - 但我想知道是否有更简单的方法来实现相同的结果。< / p>
答案 0 :(得分:1)
不是为tomcat打开特定端口,而是应该将特定域的请求内部转发到在其他端口运行的tomcat。
我们的服务器具有针对tomcat的apache的这种配置,我们使用了mod_jk
&amp;为此目的mod_proxy
。
谷歌搜索这些主题将进一步描述如何实现这一目标。因为它们本身就是一个相当大的主题。
可能的解决方案:
答案 1 :(得分:0)
由于nginx,我尝试生成自定义重定向操作失败,因此尽管重新配置nginx时遇到了初步问题,我们最终还是因为我们无法在其他任何地方解决它。
我们在nginx中发现的是它为我们的模块提供了这个:
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
导致基于端口8889的操作中的所有重定向操作丢弃其端口(位置中的链接)。
我们找到了两种方法来解决这个问题:通过删除上面的三个配置行,或者添加它们:
proxy_set_header Host $host:8889;
这两种解决方案都适用于我们。
至于我尝试创建一个相对的自定义操作,最后使用HttpServlet结果对象格式化了操作:
finalLocation = response.encodeRedirectURL(tmpLocation.toString());
输出,即使将tmpLocation添加为相对值,最终也会被构建为动作答案中的绝对位置。并且无端。