【问题标题】:Ensure execution order of two Apache Filters确保两个 Apache Filters 的执行顺序
【发布时间】:2012-06-21 06:19:57
【问题描述】:
我需要确保我的自定义过滤器始终在mod_rewrite之前执行。根据Apache Tutor,过滤器不会以确定的顺序运行:
请求处理轴很简单:各个阶段严格按顺序发生。但是在数据轴上出现了混乱。为了获得最大效率,这是流水线的,因此内容生成器和过滤器不会以确定的顺序运行。因此,例如,您通常不能在输入过滤器中设置某些内容并期望它应用于生成器或输出过滤器。
如何保证两个过滤器的执行顺序,或者有可能吗?
更新:
有人有indicated 到mod_info 来显示有关模块及其顺序的详细信息。
【问题讨论】:
标签:
apache
apache2-module
【解决方案1】:
了解这一点的最佳方法是查看 apache 源代码。 ap_hook_fixups 的 mod_proxy 和 mod_rewrite 用法是如何在特定模块之前或之后插入挂钩的完美示例。
假设你想在 mod_rewrite 之前插入一个钩子,你可以这样做:
static int my_fixup(request_rec *r)
{
/* do something with request headers before it goes to the mod_rewrite */
return OK;
}
static void register_hooks(apr_pool_t *p) {
static const char * const aszSucc[] = {"mod_rewrite.c", NULL};
ap_hook_fixups(my_fixup, NULL, aszSucc, APR_HOOK_FIRST);
}
另外,您可以查看http://httpd.apache.org/docs/2.2/developer/hooks.html 页面了解其他类型的钩子,或者更好地了解如何控制钩子调用顺序。