我正在尝试设置一个服务器,该服务器处理与服务器上目录的“正常”连接,但会通过反向代理将对 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/
或者如果你愿意,你可以附上ProxyPass
Location
块中的指令
<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>
现在一切都运转正常。