потому что мод-реврайт работает в несколько прогонов, а не в один
RewriteRule condition1 target1
RewriteRule condition2 target2
RewriteRule condition3 target3
сначала урл проверяется на condition1 и если совпадает то происходит его коррекция в target1
затем он переходит к condition2 -> коррекция, затем к condition3 -> корреция.
затем(!!!) он опять переходит к condition1 и т.д.
обработка реврайтом закончится тогда, когда ни одно из условий не выполнится за один прогон.
флаг [L] означает не конец обработки rewriterule, а конец одного прогона. т.е.:
RewriteRule condition1 target1
RewriteRule condition2 target2 [L]
RewriteRule condition3 target3
отработает так:
проверка condition1 -> коррекция в target1; проверка condition2 -> коррекция в target2; condition1 -> …
соответственно одиночное правило тоже будет работать циклично, что, собственно, и происходит:
RewriteRule (.*) public/$1 [L]
/a -> /public/a -> /public/public/a …
надо делать так
RewriteCond $1 !^(public/)
RewriteRule (.*) /public/$1
в одиночном правиле флаг L не имеет смысла
Спустя 160 сек.
можно добавить флаг NC (no-case)
не всё полезно, что в swap полезло