我编写了一个模块,用于设置mod-rewrite使用的Apache环境变量。它挂钩到ap_hook_post_read_request()
并且工作正常,但如果mod-rewrite与RewriteRule匹配,那么它会使用重写的URL再次调用我的请求处理程序。这似乎是对我的一个新请求,因为环境变量不再设置,因此我必须为每次命中执行两次(昂贵的)代码。
我做错了什么,或者有解决方法吗?
由于
答案 0 :(得分:1)
您可以在规则上使用[NS]
修饰符,使其不会被内部子请求处理(您看到的第二个传递是内部子请求)。
答案 1 :(得分:1)
据我了解,规则上的NS标志(在另一个答案中建议)使其评估为“如果我第二次被叫,请忽略我”。麻烦的是,到那时已经太迟了,因为已经调用了钩子。无论你在mod_rewrite中做什么,我相信这将是一个问题。您可以检测到第二个请求,但我不知道阻止第二个请求的任何方式。
我最好的建议是在您的(昂贵的)代码之前将检测放在您的处理程序中,如果它再次运行则退出。你可以让mod_rewrite在URL上添加一些内容,这样你就可以知道第二次调用它了。
...然而
如果在每个请求上调用你的(昂贵的)代码,它也会在图像,css文件,favicon等上被调用。你真的想要吗?或者这可能是你所看到的第二次电话?
答案 2 :(得分:1)
非常感谢,我做了类似于bmb建议的东西,它的确有效!但是根本没有涉及mod-rewrite,我在模块的请求处理程序中添加了一个“假”请求标头,如下所示:
apr_table_set(r->headers_in, "HTTP_MY_MODULE", "yes");
然后我可以在第二次重写请求的处理程序顶部检测到它。事实证明,即使mod-rewrite(或Apache?)没有在子请求中保留添加的env或notes变量(r-> subprocess_env,r-> notes),它仍会保留添加的标题。
至于我在每个请求上调用昂贵的代码,我在处理程序中有一个可配置的URL后缀/扩展名过滤器来忽略图像等请求。