Проблема mod_rewrite - PullRequest
       20

Проблема mod_rewrite

0 голосов
/ 12 октября 2008

Я пытаюсь реализовать следующее правило 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 ^([^/]+)$                   /$1/index.py                          [L]
  RewriteRule ^([^/]+)/([^/]+)            /$1/index.py?branch=$2                [L]
  RewriteRule ^([^/]+)/([^/]+)/([^/]+)$   /$1/index.py?branch=$2&commit=$3      [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

Как я могу исправить свои правила, чтобы предотвратить бесконечные внутренние перенаправления? Спасибо.

1 Ответ

0 голосов
/ 12 октября 2008

Проблема в том, что URL, на который вы переписываете, соответствует следующему проходу. L задает последнее правило, но только для этого исполнения правил URL-адреса обрабатываются снова при определенных обстоятельствах (в данном случае внутренние перенаправления). Решение состоит в том, чтобы добавить RewriteCond для предотвращения зацикливания, например:

RewriteEngine on
RewriteCond %{REQUEST_URI}              !index\.py
RewriteRule ^([^/]+)$                   /$1/index.py                          [L]
RewriteCond %{REQUEST_URI}              !index\.py
RewriteRule ^([^/]+)/([^/]+)            /$1/index.py?branch=$2                [L]
RewriteCond %{REQUEST_URI}              !index\.py
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$   /$1/index.py?branch=$2&commit=$3      [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...