Тут дело не в экранировании символов.
Как на самом деле работает mod_rewrite.
изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.
При добавлении точки в шаблон он начинает совпадать и с
index.php
так что происходит зацикливание.
Исключить бесконечный цикл можно добавлением условия
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9-_./]+)$ /index.php?url=$1 [QSA,L]
Ещё вариант не ставить
/
перед
index.php
тогда mod_rewrite после перенаправления сможет понять что запрос не изменился и остановит цикл. В этом случае допонительный
RewriteCond
не нужен.
RewriteRule ^([a-zA-Z0-9-_./]+)$ index.php?url=$1 [QSA,L]