Apache2 并行反向代理和目录指令

Apache2 并行反向代理和目录指令

我正在尝试设置一个服务器,该服务器处理与服务器上目录的“正常”连接,但会通过反向代理将对 example.com/api 的任何调用重定向到另一个服务(那里无法重写)。

到目前为止,我的努力只能导致登陆网站的索引页,或者获得 500 状态代码,这表明服务器有罪,绝对不是目标服务......

以下是 Apache 配置:

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName example.com
        UseCanonicalName Off
        #DocumentRoot /var/www/website/public
        Redirect permanent / https://website.com/

</VirtualHost>
<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName example.com
        UseCanonicalName Off
        ProxyRequests On

        <Proxy https://example.com/api>
                Order deny,allow
                Allow from all
                ProxyPreserveHost On
                ProxyPass http://proxy:port
                ProxyPassReverse http://proxy:port
        </Proxy>
        DocumentRoot /var/www/website/public
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/website/public>
                Require all granted
                AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        [SSL here]
</VirtualHost>

这有可能吗?如果是,我做错了什么?

答案1

这里的语法有点奇怪:

...
    <Proxy https://website.com/api>
            Order deny,allow
            Allow from all
            ProxyPreserveHost On
            ProxyPass http://proxy:port
            ProxyPassReverse http://proxy:port
    </Proxy>
...

据我所知,你可以用一个简单的ProxyPass指示:

ProxyPass /api/ http://backend.example.com:port/
ProxyPassReverse /api/ http://backend.example.com:port/

或者如果你愿意,你可以附上ProxyPassLocation块中的指令

<Location /api/>
   ProxyPass  http://backend.example.com:port/
   ProxyPassReverse  http://backend.example.com:port/
</Location> 

您目前有ProxyPreserveHost on这是你很少需要的东西,因此我在示例中省略了它。

答案2

好的,所以没什么好说的。我只需要在节点LoadModule内包含一些指令Location(替换Proxy节点),如下所示:

    <Location /api>
            LoadModule proxy_module modules/mod_proxy.so
            LoadModule proxy_http_module    modules/mod_proxy_http.so
            ProxyPreserveHost On
            ProxyPass http://proxy:port
            ProxyPassReverse http://proxy:port
    </Location>

现在一切都运转正常。

相关内容