是否可以在ProxyPass中使用“%{HTTP_HOST}”?

时间:2013-03-28 10:05:12

标签: apache mod-rewrite apache2 mod-proxy proxypass

我正在尝试使用apache2和mod_proxy来实现透明代理,现在它不做任何事情。只是将流量转发给正确的“主机”。

我不希望它依赖于主机 - 但是它是动态的,因此它适用于所有主机。 我试着这样做:

RewriteEngine on
RewriteLogLevel 5
RewriteLog "/var/log/apache2/rewrite.log"
RewriteRule ^(.*)$ $1
ProxyPass / http://$1

我还尝试了其他几种方法(没有效果)。 有没有什么方法可以从标题中访问“主机”并在ProxyPass指令中使用它?

在nginx中我会使用$ host,$ remote_addr等等。任何方法来替换apache上的那个?

我需要的是能够访问ProxyPass命令中的%{HTTP_HOST},%{REQUEST_URI}和%{SERVER_PORT}。

3 个答案:

答案 0 :(得分:3)

要将Apache ProxyPass指令与动态主机名一起使用,您还需要使用ModRewrite。

目的

对虚拟主机的所有请求都将ProxyPass和ProxyPassReverse(也称为“Apache网关”)发送到%{HTTP_HOST}

这样做的唯一理由是,如果在apache服务器上有特定主机名的localhost条目

实施例

Localhost文件

10.0.0.2 foo.bar.com    
10.0.0.3 bar.bar.com    

如何运作

  1. 客户向foo.bar.com发出请求(dnslookup是公共IP ...你的APACHE服务器)
  2. 您的apache服务器的foo.bar.com(网络上的其他服务器)的localhost条目为10.0.0.2
  3. 请求通过ModRewrite并附加/ path1,然后传递给ProxyPass和ProxyPassReverse
  4. ProxyPass和ProxyPassReverse通过ip 10.0.0.2将呼叫关闭到foo.bar.com
  5. 客户请求foo.bar.com ---反向代理----> foo.bar.com/path1(在某些其他内部服务器上)

    Apache配置

        <VirtualHost *:443>
        Servername *
    
        # Must not contain /path1 in path (will add /path1)
        RewriteEngine on
        RewriteCond %{REQUEST_URI} !^/path1/.*
        RewriteRule ^/(.*) https://%{HTTP_HOST}/path1$1 [NC,R=302,L]
    
        # Must contain /path1 in path (will send request to the proxy)
        RewriteEngine On
        RewriteOptions Inherit
        RewriteCond %{REQUEST_URI} ^/path1/.*
        RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [NC,P]
    
        SSLEngine on
        SSLProxyEngine On
        ProxyRequests Off
    
        ProxyPass            /  https://$1/
        ProxyPassReverse     /  https://$1/
    
        ProxyPreserveHost On
    
        ###################
        # SSL Constraints #
        ###################
    
        SSLProtocol -ALL +SSLv3 +TLSv1
    
        # Choose cipher suites
        SSLHonorCipherOrder On
        SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXPORT
    
        # SameOrigin The page can only be displayed in a frame on the same origin as the page itself
        Header set X-Frame-Options SAMEORIGIN
    
        SSLCertificateFile     /etc/apache2/example.crt
        SSLCertificateKeyFile  /etc/apache2/example.key
        SSLCertificateChainFile /etc/apache2/gd_bundle.crt
        SetOutputFilter INFLATE;proxy-html;DEFLATE
    </VirtualHost>
    

答案 1 :(得分:0)

如果您还没有这样做,请阅读本页:

https://httpd.apache.org/docs/2.2/mod/mod_proxy.html#forwardreverse

我认为ProxyRequests指令正是您所寻找的。

答案 2 :(得分:0)

回答我自己的问题:

我错过了两件事:

配置应该是:

RewriteEngine On
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1 [P]

不要忘记在虚拟目录中启用inherit:

RewriteEngine On
RewriteOptions Inherit