我正在尝试使用 apache2 和 mod_proxy 实现一个透明代理,现在它什么都不做。只是将流量转发到正确的“主机”。

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

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

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

在 nginx 中,我会使用 $host、$remote_addr 等。有什么办法可以在 apache 上替换它?

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

最佳答案

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

客观的

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

这样做有意义的唯一原因是,如果您在 apache 服务器上有特定主机名的 localhost 条目

例子

本地主机文件

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

这个怎么运作
  • 客户端向 foo.bar.com 发出请求(dnslookup 是一个公共(public) IP...你的 APACHE SERVER)
  • 您的 apache 服务器有一个 10.0.0.2 的 localhost 条目,用于 foo.bar.com(您网络上的其他服务器)
  • 请求通过 ModRewrite 并附加/path1,然后交给 ProxyPass 和 ProxyPassReverse
  • ProxyPass 和 ProxyPassReverse 将调用交给 foo.bar.com ip 10.0.0.2

  • 客户端请求 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>
    

    关于apache - 是否可以在 ProxyPass 中使用 "%{HTTP_HOST}"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15678945/

    10-13 02:47