首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自mod-rewrite的双重请求

来自mod-rewrite的双重请求
EN

Stack Overflow用户
提问于 2009-09-22 18:59:00
回答 3查看 957关注 0票数 1

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

我做错了什么,或者有没有解决这个问题的办法?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2009-09-22 19:01:32

您可以在规则上使用[NS]修饰符,使其不被内部子请求处理(您看到的第二个过程是一个内部子请求)。

票数 1
EN

Stack Overflow用户

发布于 2009-09-23 23:56:22

据我所知,规则上的NS标志(在另一个答案中建议)使其评估为“如果我第二次被调用,忽略我”。问题是,到那时已经太晚了,因为钩子已经被调用了。我相信无论你在mod_rewrite中做什么,这都会是一个问题。您可以检测到第二个请求,但我不知道有什么方法可以阻止第二个请求。

我最好的建议是将检测放在你的处理程序中,放在你的(昂贵的)代码之前,如果它第二次运行就退出。您可以让mod_rewrite在URL后面附加一些内容,这样您就可以知道它何时会被第二次调用。

然而..。

如果你的(昂贵的)代码在每次请求时都被调用,那么它也会被图像、css文件、图标等等调用。你真的想这样吗?或者,这可能就是您看到的第二个调用?

票数 1
EN

Stack Overflow用户

发布于 2009-09-24 19:24:48

非常感谢,我按照bmb的建议做了一些类似的事情,它起作用了!但是,我并没有涉及mod-rewrite,而是在模块的请求处理程序中添加了一个“伪”请求头,如下所示:

代码语言:javascript
复制
apr_table_set(r->headers_in, "HTTP_MY_MODULE", "yes");

然后,我可以在第二个重写的请求中在处理程序的顶部检测到它。事实证明,即使mod-rewrite (或者Apache?)不会在子请求中保留添加的env或note变量(r->subprocess_env,r->note),它会保留添加的头部。

至于我昂贵的代码在每次请求时都会被调用,我在处理程序中有一个可配置的URL后缀/扩展名过滤器来忽略图像等请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1461966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档