【问题标题】:Apache proxying subdomain root requestsApache 代理子域根请求
【发布时间】:2012-04-09 08:17:45
【问题描述】:

说明

  • 具有监听 8080 的 webapps 的内部 Tomcat 服务器:

    "http://internal:8080/foo-webservice/"
    " http://internal:8080/foo-website/"

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

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

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

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

用例 A

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

  • 代理到:
    “http://internal:8080/foo-website/index.html”

用例 B

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

    李>
  • 代理到:
    “http://internal:8080/foo-webservice/listener.html?param1=foo&param2=bar”

虚拟主机定义

  • 满足用例 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 文件夹中的文件均未加载。

【问题讨论】:

    标签: apache mod-rewrite mod-proxy


    【解决方案1】:

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

    【讨论】:

    • 我累了:RewriteRule ^/(.*) http://internal:8080/foo-website/$1 [QSA,P] 但结果都一样。
    【解决方案2】:
    • 我认为尝试 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>
      
    • 这不是我最初想要的,但我认为这就是解决方案。

    【讨论】:

      【解决方案3】:

      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/
      

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

      【讨论】:

      • 谢谢,当我没有必要的时候,我正忙着重写。
      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2018-02-14
      相关资源
      最近更新 更多