Проблема с mod_rewrite

Я пытаюсь реализовать следующее правило 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

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

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
340
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Спасибо, это сработало. Мне также пришлось поменять местами первое и третье правила, чтобы аргументы интерпретировались правильно.

dpq 12.10.2008 14:39

Другие вопросы по теме