使用 mod_proxy,在传递请求之前将“http://myapp.acme.com/foo.com/index.html”转换为“http://foo.com/index.html”

使用 mod_proxy,在传递请求之前将“http://myapp.acme.com/foo.com/index.html”转换为“http://foo.com/index.html”

我在端口 8080 上运行 Jetty,作为在 80 上运行的 Apache2 实例后面的反向代理。配置如下:

<VirtualHost *:80>
ServerName  default
##########################
# DocumentRoot
DocumentRoot /var/www
<Directory /var/www/>
  Options FollowSymLinks MultiViews
  AllowOverride None
  Order allow,deny
  allow from all
</Directory>

##########################
# Error Handling
ErrorDocument 503 /errors/503.html
ErrorDocument 404 /errors/404.html

##########################
# Proxy
ProxyRequests Off
<Proxy *>
  Order deny,allow
  Allow from all
</Proxy>
ProxyPass /errors !
ProxyPass / http://localhost:8080/
ProxyPreserveHost On
ProxyStatus On
</VirtualHost>

基本上,任何与其他配置的虚拟主机不匹配的请求最终都会匹配此虚拟主机。换句话说,任何与 Apache 虚拟主机不匹配的内容最终都会被代理到 Jetty。

Jetty 正在运行一个 Web 应用程序,该应用程序根据请求标头中的 Host 做出不同的响应。换句话说,两者foo.com酒吧网可以指向这个网络应用程序,它将根据您请求的主机显示一个 fooish 页面或一个 barish 页面。

我需要通过代理公开此功能,并且我希望通过以下方式实现mod_proxy将调用转换为如下形式:

http://myapp.acme.com/foo.com/index.html

http://foo.com/index.html

然后将其传递给 Jetty,以便 Web 应用程序能够根据请求的主机正确运行。使用我当前的配置,请求第一个 URL 会传递:

Host: myapp.acme.com
GET /foo.com/index.html

但我需要它传递下去

Host: foo.com
GET /index.html

答案1

这或者类似的东西可能会起作用:

ProxyPreserveHost Off # default is Off, just making the point
ProxyRemote * http://localhost:8080/
RewriteEngine On
RewriteRule ^/([^/]+)/(.*) http://$1/$2 [P]

ProxyRemote表示此代理(端口 80 上的代理)将通过指定的代理转发请求。如果这没有意义,请大声喊出来!我现在没时间了。代理文档应该有帮助。

相关内容