【问题标题】:Nginx and Tomcat - subdomain pointing to subdirectoryNginx 和 Tomcat - 指向子目录的子域
【发布时间】:2015-08-26 12:07:32
【问题描述】:

我的应用程序 example.com 有以下配置:

  1. Nginx 作为反向代理将流量从端口 80 重定向到:
  2. Tomcat 7,我在其中部署 JSF 应用程序,端口 8080
  3. 我的 xhtml 文件大多在 ROOT 文件夹中:/usr/local/tomcat7/webapps/ROOT
  4. 但我在单独的文件夹“论坛”中有一些文件:/usr/local/tomcat7/webapps/ROOT/forum

这是我的默认 nginx 配置:

server {
    server_name  www.example.com;
    return 301 $scheme://example.com$request_uri;
}
server {
  listen          80;
  server_name     example.com.br;
  root            /usr/local/tomcat7/webapps/ROOT;
  location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080/;
  }
}

所以,要访问论坛页面,我必须去 example.com/forum/forum.xhtml(forum.xhtml 是索引)

现在,我正在尝试在 nginx 中设置一个 子域forum.example.com,它将指向论坛文件夹,保留网址。也就是说,我不想在 URL 中看到后缀“/forum/”。我希望论坛文件夹表现为 root。因此,如果用户尝试 forum.example.com/anotherPageFromROOT.xhtml,他将无法做到。

这是我目前所拥有的:

server {
 listen          80;
 server_name     forum.example.com;

 location / {
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://127.0.0.1:8080/;
       rewrite ^/$ /forum/forum.xhtml break;    
 }
}

问题:

  1. 如果我点击链接(POST 请求)到文件“topic.xhtml”,也在“forum”文件夹中,URL 将是 forum.example.com/forum/topic.xhtml而不是我想要的 forum.example.com/topic.xhtml
  2. 用户可以正常访问forum.example.com/anotherPageFromROOT.xhtml

有人可以帮我解决我应该怎么做吗?谢谢!

编辑: 我认为第一个问题的根本原因是 JSF 为我的h:form 生成的action。它始终使用/forum/ 生成。

【问题讨论】:

  • proxy_pass url 以 /(斜杠)结尾 删除斜杠会发生什么?
  • 嗨@itpp13,我没有发现任何区别,两个问题仍然存在
  • 重写 /forum/([^/]+) /$1 break;
  • 当以/forum.xml 访问时,您的应用会在返回的 html 中生成正确的链接吗?
  • 嗨@itpp13,我相信这正好相反。它将 URL 中包含 /forum/ 的任何内容重定向到 ROOT 文件夹,因此是我的索引页面。用这个覆盖我之前的重写,它将进入我的索引页面http://example.com。添加你的重写并保留我的,当我点击带有POST请求的链接时,在chrome控制台中我得到GET http://example.com/forum/ 404 (Not Found)

标签: tomcat nginx url-rewriting rewrite reverse-proxy


【解决方案1】:

问题 #1 是这里房间里的大象。您不能(afaik)告诉 Tomcat 从非 ROOT 文件夹中提供页面,就好像它们在 ROOT 文件夹中一样(即,不在生成的 URL 中添加文件夹名称)。 Context 设置元素有一个 path 属性,但根据个人经验,更改它并不是一个好主意(portlet 部署错误、portlet 部署两次并使用双倍资源等)。

如果 Tomcat 有这样的设置(告诉文件夹中的 portlet 生成根 url)然后尝试使用它,否则您唯一的选择是在根文件夹中设置另一个具有正确文件的 Tomcat,因此生成的 URL不会有文件夹前缀。

一旦解决了这个问题,您就可以继续解决问题 #2。如果你用ROOT文件夹中的论坛文件设置了一个不同的Tomcat,问题就消失了;否则让我们知道你做了什么。

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 2016-07-21
    • 2016-09-05
    • 1970-01-01
    • 2014-01-28
    • 2016-01-09
    • 2010-10-17
    • 2011-08-05
    • 2015-05-08
    相关资源
    最近更新 更多