2014-06-20 2 views
3

Я хочу, чтобы связать пользователя Идентификаторы к конкретному идентификатору приложения, как:Использование переменной в RewriteCond состоянии патерн

<user_id> <app_id> 
615 1 
616 7 
617 3 
618 3  

Мой URIs выглядит как:

/<app_id>/<user_id>/... 

Теперь, я хочу, чтобы иметь возможность легко изменить приложение, не влияя на пользовательские закладки. В моем примере я хочу как

/1/615/index.html or /3/615/index.html 

быть служил

/1/615/index.html 

следующему правилу, я получаю бесконечный цикл:

RewriteMap map dbm:user-application.map 
RewriteRule ^/([0-9]+)/([0-9]+)/(.*)$ /${map:$2}/$2/$3 [R,L]    
... 
#other proxy code to forward request to applications 

Я понимаю, что после перенаправления, Apache всегда будет выполнять одно и то же правило. Затем я попытался добавить условие переписывания блокировать петлю, как

RewriteMap map dbm:user-application.map 
RewriteCond %{REQUEST_URI} !^/${map:$2} 
RewriteRule ^/([0-9]+)/([0-9]+)/(.*)$ /${map:$2}/$2/$3 [R,L]    

Если я правильно прочитал мои журналы переписывания, я могу видеть, что переменная ^/$ {карта: $ 2}! Не заменяется в шаблон состояния, но проверено «как оно». И тогда условие всегда верно, и я до сих пор получаю свой бесконечный цикл.

Любая идея заблокировать цикл, как только идентификатор приложения совпадает с моей картой?

+1

related: http://stackoverflow.com/questions/7798099/how-to-block-multiple-mod-rewrite-passes-or-infinite-loops-in-a-htaccess-cont – ben75

ответ

1

/3/615/index.html правильно перенаправление /1/615/index.html

Проблема заключается в том, что вы перенаправляете /1/615/index.html к/1/615/индексу .html - вы хотите обнаружить случай, когда преобразование карты является no-op и не перенаправляет вообще в этом случае.

Если вы не заботитесь о URL-адресе пользователя, просто измените [R, L] на [L] (удаление R), и вы должны быть в порядке, так как он не вызовет нового раунда от клиента.

Вы правы, что регрессия $ 2 не будет работать в выражении RewriteCond; это связано с тем, что RewriteRule еще не оценен. Вы можете быть в состоянии использовать% п - обратные ссылки стиль для регулярных выражений в предыдущем RewriteCond ...

RewriteCond {%REQUEST_URI} ^/([0-9]+)/ 
RewriteCond {%REQUEST_URI} !^/${map:%1} 

Но я не проверял это, так YMMV.

+0

Ну, я не могу предоставить точное исправление, которое я использовал больше, но ответ, который вы предоставляете, действительно так, как я исследовал. Благодаря! – Asterius

+0

Это сообщение в блоге касается чрезвычайно похожего случая: http://www.jeremytunnell.com/posts/mod_rewrite-attempting-to-bend-rewritemap-rewritecond-and-rewriterule-to-my-will –