Назад | Перейти на главную страницу

Почему этот прокси-пароль влияет на весь домен?

Я использую Apache и имею .conf файл как site-enabled в apache, как показано ниже.

<Virtualhost blog.example.com:80>
  ServerName blog.example.com
  ServerAdmin admin@example.com
  ProxyRequests Off
  ProxyPass        /phpmyadmin !
  ProxyPass        /  http://localhost:2368/
  ProxyPassReverse /  http://localhost:2368/
</Virtualhost>

Как видите, мне нужны только хиты blog.example.com для обработки командой ProxyPass. Однако на самом деле это влияет на все остальные домены. example.com, other.example.com.

Я что-то упустил?

Если так работает ProxyPass, есть ли способ указать ему игнорировать физические файлы и каталоги при их обнаружении?

Другие сайты включены (только один сайт работает под Ruby, остальные следуют первой форме):

<VirtualHost other.example.com:80>
  ServerName other.example.com
  ServerAdmin admin@example.com
  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 admin@example.com

  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 директива. Лучше всего использовать подстановочный знак (*) VirtualHost директива. Также я установил ServerAlias а также разнесены и отформатированы конфигурации для облегчения чтения, что полезно при отладке подобных проблем. Также я установил mod_proxy config, чтобы более точно соответствовать стандартной формуле, которую я люблю использовать для этого материала.

Также проверьте вывод настройки вашего виртуального хоста, запустив sudo apachectl -S чтобы увидеть то, что вы видите.

<Virtualhost *:80>

  ServerName blog.example.com
  ServerAlias blog.example.com
  ServerAdmin admin@example.com

  <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 admin@example.com

  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 admin@example.com

  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 определение, это может вызвать непредвиденные проблемы, подобные этой. Я предполагаю, что некоторые из имен хостов разрешаются внутри сервера на IP-адрес, отличный от того, на который отправляются запросы. Это может помешать Apache сопоставить правильный виртуальный хост.

Так что VirtualHost определение можно изменить, как показано ниже, для всех виртуальных хостов, чтобы мы могли быть уверены, что Apache соответствует виртуальному хосту на основе правильного имени.

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

Также следует отметить, что если вы хотите, чтобы запросы example.com обслуживается виртуальным хостом, отличным от хоста по умолчанию, вам понадобится ServerAlias mydomain директива.

На этой странице есть более подробная информация о том, как работают виртуальные хосты на основе имен - http://httpd.apache.org/docs/current/vhosts/name-based.html