[英]Apache Reverse Proxy For Specific Subdomain
我有一个 Apache HTTP 服务器,它有一个 tomcat 服务器的反向代理。 但是,我只希望在客户端使用子域 www 时发生反向代理。 这是因为我想用其他子域名指向其他应用,比如email。
例如 www.example.com 将 go 显示 apache tomcat webapp。
我想,这样做的方法是配置我的 DNS,这样我使用的每个子域都将指向我的服务器。 现在,除了 www,还有 server.example.com 和 posfixadmin.example.com。 但是,问题是我所有的子域最终都指向 tomcat。
因此,当我尝试访问 postfixadmin.example.com/setup.php 以通过其 web 设置设置 postfixadmin 时,它最终将我带到我的 tomcat webapp 的 404。
这是我的虚拟主机配置:
<VirtualHost www.example.com:80>
ServerName http://www.example.com
ProxyPass / http://localhost:8080
ProxyPassReverse / http://localhost:8080
</Virtualhost>
<VirtualHost server.example.com:80>
ServerName server.example.com
DocumentRoot /var/www/html/
RewriteEngine on
RewriteCond %{SERVER_NAME} =server.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} {END,NE,R=permanent}
</VirtualHost>
<VirtualHost postfixadmin.example.com:80>
ServerName postfixadmin.example.com
DocumentRoot /var/www/postfixadmin/public
ErrorLog /var/log/httpd/postfixadmin_error.log
CustomLog /var/log/httpd/postfixadmin_access.log combined
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/postfixadmin/public>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
编辑看起来代理 conf 文件什么也没做(??)。 我决定尝试一下并将第一个虚拟主机服务器名更改为以下内容:
<VirtualHost *:80>
ServerName abcd.example.com
ProxyPass / http://localhost:8080
ProxyPassReverse / http://localhost:8080
</Virtualhost>
然后,我重新启动并重新加载 Apache...但是出于某种原因,转到 www.example.com 仍然将我带到 tomcat webapp? 有谁知道是什么驱动了这个?
至于 DNS:我已经为每个子域设置了特定的 CNAME 条目,包括 www; 所有这些都指向我的服务器的公共 IP,该服务器包含我的 example.com 域(在我的例子中使用 @ - 我认为大多数 DNS 可能)。 对此可能有一些不同的策略,但我相信根据您在问题中提出的建议,您走在正确的道路上。
至于 Apache 的配置:我认为http
协议不需要在ServerName
指令中指定,并且一般来说,域不需要出现在<VirtualHost>
... </VirtualHost>
标签内。
我应该提一下,我对 Tomcat 相对不熟悉,但我假设它正在本地主机上的 8080 监听,在这种情况下这应该有所帮助。
我不是 100% 确定这就是让你咆哮的全部,但尝试修剪那个ServerName
并这样做,包括对VirtualHost
开放标记的更改:
<VirtualHost *:80>
ServerName www.example.com
ProxyPass / http://localhost:8080
ProxyPassReverse / http://localhost:8080
</Virtualhost>
您的第二个<VirtualHost>
可能需要进行类似的更改,尽管您似乎还指示它为来自端口 8080的 web.network 的请求提供服务——我认为这不是您的意图。
我想你想要的是也从 web.network 监听端口 80 ,但是如果像这样发送到server.example.com
则遵循这些指令:
<VirtualHost *:80>
ServerName server.example.com
DocumentRoot /var/www/html/
RewriteEngine on
RewriteCond %{SERVER_NAME} =server.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} {END,NE,R=permanent}
</VirtualHost>
最后,对最后一个开头的<VirtualHost>
标签进行类似的更改:
<VirtualHost *:80>
ServerName postfixadmin.example.com
DocumentRoot /var/www/postfixadmin/public
ErrorLog /var/log/httpd/postfixadmin_error.log
CustomLog /var/log/httpd/postfixadmin_access.log combined
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/postfixadmin/public>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
总而言之,这似乎更像是您正在寻找的东西:
<VirtualHost *:80>
ServerName www.example.com
ProxyPass / http://localhost:8080
ProxyPassReverse / http://localhost:8080
</Virtualhost>
<VirtualHost *:80>
ServerName server.example.com
DocumentRoot /var/www/html/
RewriteEngine on
RewriteCond %{SERVER_NAME} =server.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} {END,NE,R=permanent}
</VirtualHost>
<VirtualHost *:80>
ServerName postfixadmin.example.com
DocumentRoot /var/www/postfixadmin/public
ErrorLog /var/log/httpd/postfixadmin_error.log
CustomLog /var/log/httpd/postfixadmin_access.log combined
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/postfixadmin/public>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
我知道了!
原来问题出在ssl配置文件中——the:443端口重叠了。
谢谢您的帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.