来自mod-rewrite的双重请求

时间:2009-09-22 18:59:00

标签: apache mod-rewrite

我编写了一个模块,用于设置mod-rewrite使用的Apache环境变量。它挂钩到ap_hook_post_read_request()并且工作正常,但如果mod-rewrite与RewriteRule匹配,那么它会使用重写的URL再次调用我的请求处理程序。这似乎是对我的一个新请求,因为环境变量不再设置,因此我必须为每次命中执行两次(昂贵的)代码。

我做错了什么,或者有解决方法吗?

由于

3 个答案:

答案 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后缀/扩展名过滤器来忽略图像等请求。