我在tomcat http://localhost:8080/WebApp/
我已经配置了Apache 2(mod_proy),因此localhost可以直接访问Web应用程序,但输出端口和名称:例如http://localhost
<VirtualHost localhost:80>
ProxyPreserveHost On
ProxyPass / http://localhost:8080/WebApp/
ProxyPassReverse / http://localhost:8080/WebApp/
</VirtualHost>
index.html在http://localhost
上正确显示。
但是如果servlet重定向:
@WebServlet(description = "...", urlPatterns = { "/login" })
public class LoginServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
response.sendRedirect("a.html");
}
}
我使用网址http://localhost/login
- 我被重定向到http://localhost/WebApp/a.html
如何正确重定向到http://localhost/a.html
?
答案 0 :(得分:14)
感谢Stuart和他对这个博客的链接,我找到了一个解决方案: Reverse Proxying Tomcat Web Applications Behind Apache
解决方案:必须关闭ProxyPreserveHost!
原因:如果打开,代理后端返回的响应头将包含“localhost”或没有端口号(或80)的真实域。所以ProxyPassReverse模式不匹配(因为端口不同,如果使用其他域名,域名也不匹配)。
配置:
<VirtualHost localhost:80>
ProxyPreserveHost Off
ProxyPass / http://localhost:8080/WebApp/
ProxyPassReverse / http://localhost:8080/WebApp/
</VirtualHost>
但这只能通过http,而不是通过ajp(我不知道为什么)。 如果您仍想使用ajp,可以使用以下解决方法 - 让Apache在错误的重定向后执行另一次重定向:
<VirtualHost localhost:80>
ProxyPass /WebApp !
ProxyPass / ajp://localhost:8009/WebApp/
ProxyPassReverse / ajp://localhost:8009/WebApp/
RedirectMatch 301 ^/WebApp/(.*)$ /$1
RedirectMatch 301 ^/WebApp$ /
</VirtualHost>
需要ProxyPass /WebApp !
指令来排除mod_proxy中进一步处理的路径(因为在重定向指令之前评估代理指令)
然后,RedirectMatch
指令会将/WebApp/...
分别/WebApp
的所有内容重定向到开头没有/WebApp
的网址。
唯一的缺点是您的Web应用程序中不能有任何名为WebApp
的子文件夹
答案 1 :(得分:3)
我也遇到过这个问题并花了一些时间。我相信如果您将apache httpd配置更改为以下内容,您的重定向将起作用:
<VirtualHost localhost:80>
ProxyPreserveHost On
ProxyPass / http://localhost:8080/WebApp/
ProxyPassReverse / http://localhost/WebApp/
ProxyPassReverseCookiePath /WebApp /
</VirtualHost>
这是因为tomcat响应头将包含代理头(即Location头是http://localhost/WebApp
而不是http://localhost:8080/WebApp
),因为ProxyPreserveHost已打开。
作为脚注:这也适用于您想要更改您的webapps上下文。假设您想要将公开可见的上下文更改为上下文,您可以使用以下内容:
<VirtualHost localhost:80>
ProxyPreserveHost On
ProxyPass /context/ http://localhost:8080/WebApp/
ProxyPassReverse /context/ http://localhost/WebApp/
ProxyPassReverseCookiePath /WebApp /context
</VirtualHost>
作为参考,我发现此博客文章非常有用:Reverse Proxying Tomcat Web Applications Behind Apache
答案 2 :(得分:0)
您已经使用AJP Connector来连接apache2&amp; tomcat,它将是完美的解决方案。
如果你需要如何配置,请告诉我我将解释这个细节
答案 3 :(得分:0)
使用转发而非重定向
我认为您的问题是使用sendRedirect。实际上,调用sendRedirect是为了向浏览器显示URL已被重定向。如果你想隐藏你需要使用转发。在你的servlet中试试这个而不是sendRedirect。
String servletPath = request.getServletPath();
if(servletPath.equals("/app1")){
ServletContext ctx = request.getServletContext().getContext("/app1");
RequestDispatcher dispatcher=ctx.getServletContext().getRequestDispatcher( "/app1/app1.html" ); // or wherever you actually keep app1.html
dispatcher.forward( request, response );
}
在context.xml中设置crossContext =“true”,以便您可以将请求转发给其他Web应用程序。
<Context crossContext="true" ....../>
答案 4 :(得分:0)
尝试将apache2(在端口80上运行)请求重定向到tomcat(在端口8080上运行的应用程序服务器)时遇到了同样的问题。
这是完美配置的配置。
转到/etc/apache2/sites-available/000-default.conf
并添加以下配置:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
# for redirecting the websocket requests
ProxyPass /ws ws://localhost:7681/
#ProxyPass /ws ws://localhost:7681/
ProxyPassReverse /ws ws://localhost:7681/
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
# for redirecting the http request
ProxyPass /applicationContextUrl ' http://localhost:8080/applicationContextUrl
ProxyPassReverse /applicationContextUrl http://localhost:8080/applicationContextUrl
ProxyPassReverseCookiePath /applicationContextUrl /
ProxyPassReverseCookieDomain localhost applicationContextUrl
ProxyRequests off
ProxyTimeout 15
ErrorLog ${APACHE_LOG_DIR}/nirad_error.log
LogLevel debug
CustomLog ${APACHE_LOG_DIR}/nirad_access.log combined
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
#Require all denied
Require all granted
Require local
</Proxy>
</VirtualHost>
完成。 现在转到终端并点击以下命令。
sudo a2enmod proxy_http
(用于http重定向)。sudo a2enmod proxy_wstunnel
(用于websocket重定向)sudo service apache2 restart