3

我正在尝试使用 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}。

4

3 回答 3

3

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

客观的

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

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

例子

本地主机文件

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

这个怎么运作

  1. 客户端向 foo.bar.com 发出请求(dnslookup 是公共 IP...您的 APACHE SERVER)
  2. 您的 apache 服务器有一个 10.0.0.2 的 localhost 条目,用于 foo.bar.com(您网络上的其他服务器)
  3. 请求通过 ModRewrite 并附加 /path1,然后移交给 ProxyPass 和 ProxyPassReverse
  4. ProxyPass 和 ProxyPassReverse 在 ip 10.0.0.2 上将呼叫传递给 foo.bar.com

客户端请求 foo.bar.com ---反向代理到----> foo.bar.com/path1(在一些其他内部服务器上)

阿帕奇配置

    <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>
于 2013-09-18T18:32:18.210 回答
1

只是回答我自己的问题:

我错过了两件事:

配置应该是:

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

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

RewriteEngine On
RewriteOptions Inherit
于 2013-03-28T14:24:10.827 回答
0

如果您还没有阅读此页面,您应该阅读:

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

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

于 2013-03-28T14:04:42.840 回答