У меня есть эта установка, которая работает почти нормально и, по-видимому, работает точно так же, как этот:
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
по очевидным причинам (я не думаю, что мы можем установить несколько ServerName
s без нескольких 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 - плюс это больше гарантии работы в других случаях. Может, мне стоит задать еще один вопрос, как мы можем макрос / шаблон / функция / сделать что-нибудь с этим дублированным кодом, чтобы написать его только один раз.