Я пытаюсь реализовать следующее правило mod_rewrite:
host.com/developer/ => host.com/developer/index.py
host.com/developer/branchX => host.com/developer/index.py?branch=branchX
host.com/developer/branchX/commitY => host.com/developer/index.py?branch=branchX&commit=commitY
В настоящее время соответствующий раздел конфигурации выглядит так:
Options FollowSymLinks
AllowOverride None
RewriteEngine on
RewriteRule ^([^/]+)$ //index.py [L]
RewriteRule ^([^/]+)/([^/]+) //index.py?branch= [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ //index.py?branch=&commit= [L]
Однако после того, как URL-адрес был первоначально переписан, происходит внутреннее перенаправление, и URL-адрес перезаписывается снова, разрушая его. Процесс повторяется много раз и в конечном итоге приводит к ошибке 500. Журнал (временные метки и части perdir удалены):
[..initial] (3) strip per-dir prefix: /home/www/host.com/master/a -> master/a
[..initial] (3) applying pattern '^([^/]+)$' to uri 'master/a'
[..initial] (3) strip per-dir prefix: /home/www/host.com/master/a -> master/a
[..initial] (3) applying pattern '^([^/]+)/([^/]+)' to uri 'master/a'
[..initial] (2) rewrite 'master/a' -> '/master/index.py?branch=a'
[..initial] (3) split uri=/master/index.py?branch=a -> uri=/master/index.py, args=branch=a
[..initial] (1) internal redirect with /master/index.py [INTERNAL REDIRECT]
[..initial/redir#1] (3) strip per-dir prefix: /home/www/host.com/master/index.py -> master/index.py
[..initial/redir#1] (3) applying pattern '^([^/]+)$' to uri 'master/index.py'
[..initial/redir#1] (3) strip per-dir prefix: /home/www/host.com/master/index.py -> master/index.py
[..initial/redir#1] (3) applying pattern '^([^/]+)/([^/]+)' to uri 'master/index.py'
[..initial/redir#1] (2) rewrite 'master/index.py' -> '/master/index.py?branch=index.py'
[..initial/redir#1] (3) split uri=/master/index.py?branch=index.py -> uri=/master/index.py, args=branch=index.py
Как я могу исправить свои правила, чтобы предотвратить бесконечные внутренние перенаправления? Спасибо.

Проблема в том, что URL-адрес, на который вы переписываете, совпадает на следующем проходе. L указывает последнее правило, но только для этого выполнения правил URL-адреса обрабатываются снова при определенных обстоятельствах (в данном случае внутренние перенаправления). Решение состоит в том, чтобы добавить RewriteCond для предотвращения зацикливания, например:
RewriteEngine on
RewriteCond %{REQUEST_URI} !index\.py
RewriteRule ^([^/]+)$ //index.py [L]
RewriteCond %{REQUEST_URI} !index\.py
RewriteRule ^([^/]+)/([^/]+) //index.py?branch= [L]
RewriteCond %{REQUEST_URI} !index\.py
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ //index.py?branch=&commit= [L]
Спасибо, это сработало. Мне также пришлось поменять местами первое и третье правила, чтобы аргументы интерпретировались правильно.