为什么这个proxypass影响所有的域名?

我正在运行Apache,并在apache中有一个.conf文件作为site-enabled ,如下所示。

 <Virtualhost blog.example.com:80> ServerName blog.example.com ServerAdmin [email protected] ProxyRequests Off ProxyPass /phpmyadmin ! ProxyPass / http://localhost:2368/ ProxyPassReverse / http://localhost:2368/ </Virtualhost> 

正如你所看到的,我只需要点击blog.example.com来处理ProxyPass命令。 但是,它实际上影响所有其他域example.comother.example.com

我在这里错过了什么?

如果这就是ProxyPass的工作方式,有没有办法告诉它忽略物理文件和目录?

其他网站启用(只有一个网站运行ruby,其余的遵循第一种forms):

 <VirtualHost other.example.com:80> ServerName other.example.com ServerAdmin [email protected] DocumentRoot /var/www/html/other ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <Virtualhost other2.example.com:80> ServerName other2.example.com ServerAdmin [email protected] DocumentRoot /var/www/html/rails/other2/public <Directory /var/www/html/rails/other2/public> AllowOverride all Options -MultiViews Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined PassengerUser www-data PassengerAppEnv production PassengerRuby /usr/local/rvm/gems/ruby-2.1.2/wrappers/ruby </Virtualhost> 

VirtualHost定义中使用FQDN 并不是最佳实践 ,它可能会导致这样的意外问题。 我猜测一些主机名在服务器内parsing为一个不同于发送请求的IP地址。 这可能会阻止Apache匹配正确的虚拟主机。

所以虚拟主机的定义可以如下改变,所有的虚拟主机,所以我们可以肯定Apache匹配正确的名称为基础的虚拟主机。

 <VirtualHost *:80> or <VirtualHost [insert public IP here]:80> 

还有一点需要注意的是,如果你想请求一个虚拟主机服务的example.com而不是默认主机,你需要一个ServerAlias mydomain指令。

本页面详细介绍了基于名称的虚拟主机是如何工作的 – http://httpd.apache.org/docs/current/vhosts/name-based.html

像这样调整你的configuration。 请注意我为VirtualHost指令设置的通配符。 VirtualHost指令是通配符( * )的最佳实践。 此外,我设置了一个ServerAlias以及间隔和格式化的configuration更容易可读性是谁debugging这样的问题很有帮助。 此外,我设置mod_proxyconfiguration更贴近我喜欢用这个东西的标准公式。

另外,通过运行sudo apachectl -S检查你的虚拟主机设置的输出,看看你能看到什么。

 <Virtualhost *:80> ServerName blog.example.com ServerAlias blog.example.com ServerAdmin [email protected] <IfModule mod_proxy.c> ProxyRequests Off ProxyPreserveHost On <Proxy *> AddDefaultCharset off Order deny,allow Allow from all </Proxy> ProxyPass /phpmyadmin ! ProxyPass / http://localhost:2368/ ProxyPassReverse / http://localhost:2368/ </IfModule> </Virtualhost> <VirtualHost *:80> ServerName other.example.com ServerAlias other.example.com ServerAdmin [email protected] DocumentRoot /var/www/html/other ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <Virtualhost *:80> ServerName other2.example.com ServerAlias other2.example.com ServerAdmin [email protected] DocumentRoot /var/www/html/rails/other2/public <Directory /var/www/html/rails/other2/public> AllowOverride all Options -MultiViews Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined PassengerUser www-data PassengerAppEnv production PassengerRuby /usr/local/rvm/gems/ruby-2.1.2/wrappers/ruby </Virtualhost>