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

Несколько серверов на одном порте с использованием эластичного балансировщика нагрузки aws

У меня есть эта установка, которая работает почти нормально и, по-видимому, работает точно так же, как этот:

UseCanonicalNames off

<VirtualHost *:8888>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} !^www\.example1\.com
  RewriteCond %{HTTP_HOST} ^www\.[^.]+\.com$
  RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
  RewriteRule ^www\.([^.]+)\.com(.*) /var/www/html/$1$2 [L]
</VirtualHost>

Что он делает, так это все перенаправляет www.NNN.com Кроме example1 в соответствующую папку внутри /var/www/html/NNN. Это основы того, что мне нужно. Он имеет дополнительный бонус в виде имени (example1) для размещения всех других имен внутри себя в example1/NNN/, который тоже отлично работает!

Основная проблема, возможно, в том, что все это настроено за Amazon ELB, направляющим порт 80 на внутренний 8888.

Итак, единственная проблема, которую я обнаружил до сих пор: если я указываю в браузере www.example.com/anything/ это нормально, но чтобы www.example.com/anything (без последней косой черты) он перенаправит браузер на неработающую ссылку www.example.com:8888/anything/ будь то с example или NNN.

Теперь я понимаю, что наверное не следует использовать Rewrite для этого, а я уже пытаюсь все поменять на mod_vhost_alias вместо этого, но это заставило меня задуматься если есть что-нибудь, что можно сделать, чтобы решить проблему выше наряду с любыми другими проблемами, которые могут возникнуть, поскольку я не использовал "правильный способ" с UseCanonicalNames on и ServerName по очевидным причинам (я не думаю, что мы можем установить несколько ServerNames без нескольких VirtualHostс). Конечно, использовать их было бы идеально, но я не мог найти никакого пути, и поэтому сейчас иду в другом направлении.

Итак, кто-нибудь сделает шаг вперед? :)

Во-первых, вы правы в том, что это довольно серьезное злоупотребление mod_rewrite.

При этом проблема, с которой вы столкнулись, связана с вашим правилом перезаписи. Похоже, вы захватываете все, что находится после имени хоста, хотя на самом деле все, что вы хотите захватить, - это путь. Соответственно вместо

RewriteRule ^www\.([^.]+)\.com(.*) /var/www/html/$1$2 [L]

Вы хотите

RewriteRule ^www\.([^.]+)\.com(:[0-9]+)?/(.*) /var/www/html/$1/$3 [L]

Как я уже сказал, вот что я сделал для решения своей проблемы:

UseCanonicalNames off

NameVirtualHost *:8888
<VirtualHost *:8888>
  ServerName example1.com
  ServerAlias *.example1.com

  # more stuff below just to illustrate why I don't like this solution
  # redirect to HTTPS
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP_HOST} ^login\.(.*)$
  RewriteRule ^(.*) https://%1/login$1 [L]
  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
  RewriteRule ^/login(.*) https://%1/login$1 [L]
</VirtualHost>

<VirtualHost *:8888>
  ServerAlias *
  VirtualDocumentRoot /var/www/html/%-3

  # more stuff below again, to illustrate why I don't like this solution
  # redirect to HTTPS
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP_HOST} ^login\.(.*)$
  RewriteRule ^(.*) https://%1/login$1 [L]
  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
  RewriteRule ^/login(.*) https://%1/login$1 [L]
</VirtualHost>

Пока я жду и надеюсь получить ответ на вопрос, это мое принятое решение.

Мне он на самом деле нравится, почти больше, чем тот, который я пробовал с Rewrite - плюс это больше гарантии работы в других случаях. Может, мне стоит задать еще один вопрос, как мы можем макрос / шаблон / функция / сделать что-нибудь с этим дублированным кодом, чтобы написать его только один раз.