Для проблемы 2, я думаю, что ваше первое правило защиты просто должно перенаправить все субдомены. Он перенаправляет www, но позволяет username.domain.com проходить как есть.
Это перенаправит любой запрос прямого доступа на путь пользователя.
RewriteCond %{HTTP_HOST} ^.+\.domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]
Я думаю, что это может быть немного проще, просто найти любой хост, оканчивающийся на domain.com (который даже не обрабатывает субдомен, только domain.com) (я не проверял это ....)
RewriteCond %{HTTP_HOST} domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]
Для проблемы 1 я тоже в тупике, извините. Он действует так, словно косая черта нарушает правила, поэтому проваливается как есть. Но я бы ожидал, что он будет делать так, как вы хотите:
username.domain.com / sub1 / => username.domain.com/users/username/sub1/
Возможно, попробуйте тег %{REQUEST_URI}
, вместо того, чтобы пытаться захватить .*
. Я не вижу разницы, но, возможно, это поможет.
RewriteCond %{REQUEST_URI} !^/users/ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteRule .* /users/%1%{REQUEST_URI} [L]