The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Патч для mod_rewrite (избавляет от зацикливания) (mod_rewrite apache patch loop)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: mod_rewrite, apache, patch, loop,  (найти похожие документы)
Date: Fri, 22 Feb 2002 18:54:43 +0500 From: Alex Pinzhenin <ap@ur.ru> To: apache-talk@lists.lexa.ru Subject: Патч для mod_rewrite (избавляет от зацикливания) На днях, в очередной раз столкнувшись с зацикливанием mod_rewrite, был написан патчик. Умеет он следующее: 1) Ограничивает количество internal redirect'ов (по умолчанию 50) 2) Ограничивает количество просматриваемых RewriteRule на запрос (по умолчанию 300). Вот, собственно и все. Кому интересно, пользуйтесь. *** src/modules/standard/mod_rewrite.c.orig Thu Feb 21 13:05:24 2002 --- src/modules/standard/mod_rewrite.c Thu Feb 21 16:34:21 2002 *************** *** 99,104 **** --- 99,115 ---- #include <sys/uio.h> #endif + #ifndef REWRITE_MAX_RULES + #define REWRITE_MAX_RULES 300 + #endif + #ifndef REWRITE_MAX_REDIRECTS + #define REWRITE_MAX_REDIRECTS 50 + #endif + + #define REWRITE_FIXUP_NOTE "rewrite_fixup_redirect" + + int redirect_count; /* Счетчик циклов для fixup */ + /* ** +-------------------------------------------------------+ ** | | *************** *** 1361,1366 **** --- 1372,1405 ---- } } + /* Проверим и установим флаг первого запроса */ + { + request_rec *q; + int note_found = 0; + for (q = r; q != NULL; q = q->prev) { + if( ap_table_get(q->notes, REWRITE_FIXUP_NOTE) != NULL ) { + note_found = 1; + break; + } + } + ap_table_set(r->notes, REWRITE_FIXUP_NOTE, "OK"); + + if( !note_found ) { + redirect_count = REWRITE_MAX_REDIRECTS; + rewritelog(r, 3, "setting redirect count notice" ); + } + } + + /* Проверим количество циклов */ + if( redirect_count-- <= 0 ) { + /* очень много итераций */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, r, + "too many rewrite internal redirects: %s", r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } + + rewritelog(r, 3, "internal redirect count: %d", redirect_count ); + /* * remember the current filename before rewriting for later check * to prevent deadlooping because of internal redirects *************** *** 1374,1379 **** --- 1413,1425 ---- rulestatus = apply_rewrite_list(r, dconf->rewriterules, dconf->directory); if (rulestatus) { + if (strlen(r->filename) > 20 && + strncmp(r->filename, "too_many_iterations:", 20) == 0) { + /* очень много итераций */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, r, + "too many rewrite rules (possible loop): %s", r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } else if (strlen(r->filename) > 6 && strncmp(r->filename, "proxy:", 6) == 0) { /* it should go on as an internal proxy request */ *************** *** 1611,1616 **** --- 1657,1663 ---- int changed; int rc; int s; + int loopcount = REWRITE_MAX_RULES; /* * Iterate over all existing rules *************** *** 1619,1624 **** --- 1666,1678 ---- changed = 0; loop: for (i = 0; i < rewriterules->nelts; i++) { + if( loopcount-- <= 0 ) { + rewritelog(r, 2, "too many iterations '%s'", r->filename); + r->filename = ap_pstrcat(r->pool, "too_many_iterations:", r->filename, NULL); + changed = ACTION_NORMAL; + break; + } + p = &entries[i]; /*

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, Michael Shigorin (ok), 21:11, 31/03/2008 [ответить]  
  • +/
    Надо же, до сих пор прикладывается с -F 60 Для удобства -- ссылка на письмо ... большой текст свёрнут, показать
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру