В вашем втором состоянии есть паразит !
.!
перед шаблоном означает, что условие истинно, когда регулярное выражение не соответствует (как в третьем условии).!
внутри шаблона - просто буквальный символ.
Условия хоста должны быть примерно такими:
RewriteCond %{HTTP_HOST} ^abcsite\.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^www\.abcsite\.com$ [NC]
И на самом деле их можно объединить в одно условие (примечание, нет [OR]
здесь):
RewriteCond %{HTTP_HOST} ^(www\.)?abcsite\.com$ [NC]
Ваше третье условие предназначено для предотвращения циклов перенаправления (/foo
→ /abc/foo
→ /abc/abc/foo
→…).Это говорит о том, что правило не применяется, если URL-адрес запроса начинается с /abc/
.Тем не менее, фактическое перенаправление является внутренним перенаправлением: если пользователь обращается к abcsite.com/foo
, сервер внутренне переписывает это в /webroot/abc/foo
, но REQUEST_URI
остается таким же, /foo
.
Причина, по которой это не такне вызывает цикл перенаправления, поскольку он, скорее всего, переписывает правила в abc/.htaccess
, которые переопределяют этот после завершения перенаправления.
Что следует проверить вместо этого в третьем условии, это путь, соответствующий правилу перезаписи:
RewriteCond $1 !^abc/
RewriteRule (.*) /abc/$1 [L]