应用背景:在同一服务器网页上,通过不同目录访问内网的不同服务器。
开启相应模块:虚拟主机和代理模块
为了方便操作,最好启用虚拟主机来配置:
# 在httpd.conf中取消注释以下代码
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
配置虚拟主机和反向代理
在httpd_vhosts.conf中编辑:
<VirtualHost *:80>
ProxyPass / http://127.0.0.1:8888/
ProxyPassReverse / http://127.0.0.1:8888/
</VirtualHost>
上面是最简单的虚拟主机反向代理:访问这个服务器的80端口时,会自动跳转到该服务器上8888端口的服务页面。但是当需要在这个端口的网页上,既能访问网页,又能访问其他端口的服务,就需要通过二级目录的反向代理,在这个网页的地址中访问服务。
配置二级目录反向代理
二级目录/service反向代理至http://127.0.0.1:8888/配置如下:
<VirtualHost *:80>
ProxyPass /service/ http://127.0.0.1:8888/
ProxyPassReverse /service/ http://127.0.0.1:8888/
</VirtualHost>
但是这样配置会出现一个问题:代理的服务下若需要加载css或js等文件,即使用了相对路径的文件,会重定向至该网页的根目录下,而不是/service。对于这样的服务,如果服务的主要内容不是在该服务的根目录下(http://127.0.0.1:8888/),而是其子目录(http://127.0.0.1:8888/service/),就可以通过以下配置解决css文件加载错误的问题:
<VirtualHost *:80>
ProxyPass /service http://127.0.0.1:8888/service/
ProxyPassReverse /service http://127.0.0.1:8888/service/
</VirtualHost>
但是这样配置的条件是两个二级目录的名称必须是一致的,这是因为这里利用了一个代理路径的错误:将服务的service路径映射到/service会导致服务的 service路径 丢失,例如 service/index.html映射到网页中的相对路径会变成 /index.html ,但是由于映射到/service这个二级目录,会让这个index.html的显示路径为*/service/index.html。具体的原因未知,但是这样的配置是实际可行的,可以解决css文件路径错误的问题。