1

我想在我的应用程序和客户端之间有一个 apache http 服务器。

客户端访问时必须传递查询参数。例如,如果我的客户端在http://myhost:myport/myapp中运行,那么只能通过传递参数 myparam 来访问它。像http://myhost:myport/myapp?myparam=123

因此,在我的 apache http 服务器中,我想过滤不包含查询参数 myparam 的请求。

我尝试使用过滤器。它有一些预定义的过滤器,但没有一个过滤器满足我的要求。我尝试使用mod_ext_filter。但似乎整个内容都传递给了我的程序,而不是 URL。由于我需要根据 URL 中存在的参数进行过滤,因此我认为它不能满足我的要求。

是否有任何 http 服务器模块可用于根据 URL 中传递的参数进行过滤?

编辑

此外,我还需要从查询参数中获取值并对其进行验证。验证是一个 REST 服务调用

4

1 回答 1

1

在 2.4 中,您可以执行以下简单操作:

<Location /myapp>
  Require expr %{QUERY_STRING} =~ /myparam/
</location>

您可能可以使用 <if> 和捕获来执行此操作,但我不知道如何让它查找上下文根的“映射”以查询参数。

如果你有很多 myapp->myparam 对,你可能想去老学校 mod_rewrite 并将它们存储在基于 txt 的重写映射中。这是一个示例,其中包含一些“有趣的”重写技巧来完成您所描述的内容:

RewriteMap foo txt:/tmp/rewrite.map
RewriteEngine ON
# Fancy way to check two variables are equal in a RewriteCond
RewriteCond %{QUERY_STRING},${foo:$1} !^([^,]+),\1
# grab the first segment
RewriteRule ^/([^/]+)/ - [F]

但是(如果如稍后在评论中讨论的那样)您需要从某种远程 Web 服务中检索地图,您需要在 httpd 中实现 C 或 Lua 模块。那里的困难部分成为检索远程响应,其他部分是微不足道的:

您可以编写自己的 access_checker 模块,该模块很容易找到 r->uri 和 r->args。但是您需要自己的 http 客户端来进行传出 REST 调用——核心中没有用于此的 API。– 召集人 8 月 24 日 13:27

于 2015-08-24T13:17:51.530 回答