2008-10-12 3 views
0

Я пытаюсь выполнить следующую mod_rewrite правила:mod_rewrite проблема

host.com/developer/ => host.com/developer/index.py
host.com/developer/branchX => хост .com/разработчик/index.py? филиал = branchX
host.com/developer/branchX/commitY => host.com/developer/index.py?branch=branchX & совершают = 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 

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

ответ

0

Проблема в том, что 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] 
+0

Спасибо, это сработало. Мне также пришлось поменять первый и третий правила, чтобы аргументы были правильно истолкованы. – dpq 2008-10-12 10:39:07