Apache代理子域根请求

时间:2012-03-25 16:20:59

标签: apache mod-rewrite mod-proxy

描述

  • 内部Tomcat服务器,其webapps监听8080:

    的 “http://内部:8080 /富Web网页/”
    的 “http://内部:8080 /富-网站/”

  • 面向外部的Apache服务器代理子域的请求:

    “http://foo.domain.com/”

  • 子域根目录的任何请求都将代理到Tomcat上的foo-website webapp。

  • 任何其他请求都将代理到相应的路径/ webapp

用例A

  • 请求:
    “http://foo.domain.com/index.html”

  • 代理:
    的 “http://内部:8080 /富-网站/ index.html中”

用例B

  • 请求:
    “http://foo.domain.com/webservice/listener.html?param1=foo&param2=bar”

  • 代理:
    的 “http://内部:8080 /富Web网页/ listener.html参数1 = FOO&安培; param2的=栏”

VirtualHost定义

  • 满足用例B的当前虚拟主机定义:

    <VirtualHost *:80>
        ServerName foo.domain.com
    
        ProxyRequests Off
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ErrorLog /var/log/apache2/foo_error.log
        LogLevel warn
        CustomLog /var/log/apache2/foo_access.log combined
    
        # RewriteRules
        # ?
    
        # ProxyPass
        ProxyPreserveHost On
        ProxyPass        / http://internal:8080/
        ProxyPassReverse / http://internal:8080/
    </VirtualHost>
    

尝试1

    # RewriteRules
    RewriteEngine On
    RewriteRule ^/(.*) http://internal:8080/foo-website/$1 [P]
  • 满足用例A
  • 用例B失败

尝试2

    # RewriteRules
    RewriteEngine On
    RewriteRule ^/$ http://internal:8080/foo-website/$1 [P]
  • 满足用例B
  • 用例A不完全满意
  • foo-website中的index.html已加载,但js,img或css文件夹中没有任何文件。

3 个答案:

答案 0 :(得分:2)

ProxyPass规则按顺序匹配

 ProxyPass        /webservice/ http://internal:8080/foo-webservice/
 ProxyPassReverse /webservice/ http://internal:8080/foo-webservice/

 ProxyPass        /website/ http://internal:8080/foo-website/
 ProxyPassReverse /website/ http://internal:8080/foo-website/

 ProxyPass        / http://internal:8080/foo-website/
 ProxyPassReverse / http://internal:8080/foo-website/

没有重写规则。那还不够好吗?

答案 1 :(得分:0)

我认为您需要使用第一次尝试,但在每个RewriteRule指令末尾的方括号中包含QSA(查询字符串追加)标记。

答案 2 :(得分:0)

  • 我认为尝试2的问题(没有映射js,img或css文件夹中的文件)表明我的方法是错误的。

  • 我现在的解决方案是将任何请求重定向到根目录,再转移到 foo-website webapp。

            <VirtualHost *:80>
                    ServerName foo.domain.com
    
                    ProxyRequests Off
    
                    <Proxy *>
                            Order deny,allow
                            Allow from all
                    </Proxy>
    
                    ErrorLog /var/log/apache2/foo_error.log
                    LogLevel warn
                    CustomLog /var/log/apache2/foo_access.log combined
    
                    # RewriteRules
                    RewriteEngine On
                    RewriteRule   ^/$  /foo-website/  [R]
    
                    # ProxyPass
                    ProxyPreserveHost On
                    ProxyPass        / http://internal:8080/
                    ProxyPassReverse / http://internal:8080/
            </VirtualHost>
    
  • 这不是我原本想要的,但我认为这是决议。