如何在 Apache HTTP 服务器中根据请求 URL 进行过滤

How to filter based on request URL in Apache HTTP server

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

客户端访问时必须传递一个查询参数。 例如,如果我的客户是 http://myhost:myport/myapp then it has to be accessed only by passing the parameter myparam. Like http://myhost:myport/myapp?myparam=123 中的 运行。

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

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

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

编辑

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

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

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

您可能可以使用 和捕获来执行此操作,但我不知道如何使用它来查找上下文根的 "map" 以查询参数。

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

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

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

You could write your own access_checker module that finds r->uri and r->args pretty easily. But you need your own http client to make the outgoing REST call -- there is no API for this in the core. – covener Aug 24 at 13:27