我已经设置了一个Apache反向代理到正在工作的Tomcat,我可以加载我的url并获得连接到Tomcat后端。 我现在试图做的是重写用户在浏览器中看到的URL。 这是我的代码 –
LoadModule proxy_html_module modules/mod_proxy_html.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so # DON'T TURN ProxyRequests ON! Bad things will happen ProxyRequests off # Enabling mod_proxy_html ProxyHTMLEnable On ProxyHTMLLogVerbose On LogLevel Debug SSLProxyEngine on # Setup mod_proxy_ajp load balancer to the 2 happ hosts <Proxy balancer://happcluster> BalancerMember ajp://happ01.domain.com:8009 loadfactor=1 BalancerMember ajp://happ02.domain.com:8009 loadfactor=1 ProxySet lbmethod=bytraffic ProxySet stickysession=JSESSIONID </Proxy> # rewrite setup RewriteEngine On RewriteLog /var/log/httpd/rewrite_log RewriteLogLevel 8 RewriteCond %{HTTP_HOST} !^www.* [NC] RewriteCond %{HTTP_HOST} ^app\.domain\.com$ [NC] RewriteCond %{REQUEST_URI} !^/app1/.*$ RewriteCond %{REQUEST_URI} !^.*\.ico$ [NC] RewriteRule ^(/.*) balancer://happcluster/app$1 [P] # Necessary to have mod_proxy_html do the rewriting RequestHeader unset Accept-Encoding # Be prepared to rewrite the HTML/CSS files as they come back # from Tomcat SetOutputFilter proxy-html SetOutputFilter INFLATE;DEFLATE # Rewrite JavaScript and CSS files in addition to HTML files ProxyHTMLExtended On # Output Strict XHTML (add "Legacy" to the end of the line below # to output Transitional XHTML) ProxyHTMLDoctype XHTML # Rewrite HTTP headers and HTML/CSS links for everything else ProxyPassReverse /app1/ / ProxyPassReverseCookiePath /app1/ / ProxyHTMLURLMap /app1/ /
但是,当我在浏览器中键入http://app.domain.com时,URL将被重写为http://app.domain.com/app1/ …..
我正在使用mod_proxy_ajp负载平衡请求到2个后端tomcat服务器,这似乎是工作。
有任何想法吗?
编辑
这里是我的重写日志片段,它显示了代理到后端 –
[app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (2) init rewrite engine with requested uri / [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (3) applying pattern '^(/.*)' to uri '/' [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (4) RewriteCond: input='app.domain.com' pattern='!^www.*' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (4) RewriteCond: input='app.domain.com' pattern='^app\.domain\.com$' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (4) RewriteCond: input='/' pattern='!^/app1/.*$' => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (4) RewriteCond: input='/' pattern='!^.*\.ico$' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (2) rewrite '/' -> 'balancer://happcluster/app1/' [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (2) forcing proxy-throughput with balancer://happcluster/app1/ [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d73c0/initial] (1) go-ahead with proxy request proxy:balancer://happcluster/app1/ [OK] [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (2) init rewrite engine with requested uri /app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1 [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (3) applying pattern '^(/.*)' to uri '/app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1' [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (4) RewriteCond: input='app.domain.com' pattern='!^www.*' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (4) RewriteCond: input='app.domain.com' pattern='^app\.domain\.com$' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (4) RewriteCond: input='/app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1' pattern='!^/app1/.*$' => not-matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (3) applying pattern '^(/.*)' to uri '/app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1' [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (4) RewriteCond: input='app.domain.com' pattern='!^www.*' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (4) RewriteCond: input='app.domain.com' pattern='^app\.domain\.com$' [NC] => matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (4) RewriteCond: input='/app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1' pattern='!^/app1/.*$' => not-matched [app.domain.com/sid#2b0c5d2d4ef0][rid#2b0c5d0d53b0/initial] (1) pass through /app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1
并从我access_log片段 –
"GET /app1/login.jsp HTTP/1.1" 200 607 "GET / HTTP/1.1" 302 - "GET /app1/login.jsp;jsessionid=F6D9765F6A737DB373D9C3AA60211B68.worker1 HTTP/1.1" 200 607
这种事情是注定要失败的,因为Tomcat也会在自己生成的HTML中embedded自相关的URL。 还有一个第三方模块来解决这个问题,但是即使使用重写规则,通常也表明你做错了事情。 真正有效的唯一技术是在Apache和Tomcat上使用相同的URL。 在这种情况下,只需找出Tomcat上下文URL,ProxyPass全部。
我同意Shane Madden,你应该看看mod_proxy_ajp而不是mod_jk。 这是英里更容易configuration,完全相同的事情,是Apache的一部分,而不是一个单独的一块。