Двойной запрос от mod-rewrite - PullRequest
       9

Двойной запрос от mod-rewrite

1 голос
/ 22 сентября 2009

Я написал модуль, который устанавливает переменные окружения Apache для использования mod-rewrite. Он подключается к ap_hook_post_read_request(), и это прекрасно работает, но если mod-rewrite соответствует RewriteRule, тогда он выполняет второй вызов моего обработчика запросов с переписанным URL-адресом. Это выглядит как новый запрос для меня в том, что переменные окружения больше не устанавливаются, и поэтому мне приходится выполнять мой (дорогой) код дважды для каждого попадания.

Что я делаю не так, или есть способ обойти это?

Спасибо

Ответы [ 3 ]

1 голос
/ 24 сентября 2009

Насколько я понимаю, флаг NS (предложенный в другом ответе) в правиле заставляет его оценивать как "если меня вызывают второй раз, игнорируйте меня". Беда в том, что к тому времени уже слишком поздно, так как ловушка уже была вызвана. Я считаю, что это будет проблемой, независимо от того, что вы делаете в mod_rewrite. Вы можете обнаружить второй запрос, но я не знаю, как предотвратить второй запрос.

Мое лучшее предложение - поместить обнаружение в ваш обработчик перед вашим (дорогим) кодом и выйти, если оно запускается во второй раз. Вы можете добавить mod_rewrite к URL-адресу, чтобы вы знали, когда он вызывается во второй раз.

Однако ...

Если ваш (дорогой) код вызывается при каждом запросе, он также вызывается для изображений, CSS-файлов, значков и т. Д. Вы действительно этого хотите? Или это, возможно, то, что вы видите как второй звонок?

1 голос
/ 24 сентября 2009

Спасибо большое, я сделал что-то похожее на то, что предложил bmb, и это работает! Но вместо того, чтобы вообще включать в него mod-rewrite, я добавил «поддельный» заголовок запроса в обработчик запросов моего модуля, например:

apr_table_set(r->headers_in, "HTTP_MY_MODULE", "yes");

Тогда я мог обнаружить это в верхней части моего обработчика по второму переписанному запросу. Оказывается, что хотя mod-rewrite (или Apache?) Не сохраняет добавленные переменные env или notes (r-> subprocess_env, r-> notes) в подзапросе, он сохраняет добавленные заголовки.

Что касается моего дорогого кода, вызываемого при каждом запросе, у меня есть настраиваемый фильтр суффикса / расширения URL в обработчике, чтобы игнорировать изображения и т. Д. Запросы.

1 голос
/ 22 сентября 2009

Вы можете использовать модификатор [NS] в правиле, чтобы не обрабатывать его для внутренних подзапросов (второй проход, который вы видите, - это внутренний подзапрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...