我有一个用 C 编写的自定义 apache 模块。它的工作是从 api 获取信息并将其发送到侦听特定主机/端口的服务器并返回结果 json。我在conf文件中设置了主机/端口,以便它是可配置的。 这对于 api 的一个版本来说效果很好。我的工作conf文件如下所示:
LoadModule Mine_module /etc/httpd/dev_modules/mine.so
<Directory "/var/www/html/api/v9.1">
apiHost localhost
apiPort 2024
SetHandler mine
LogLevel info
</Directory>
我使用 apache AP_INIT_TAKE1 命令将值加载到指令调用中的变量中。 现在,我希望同一个模块能够根据目录与多个主机/端口组合进行通信。 我尝试制作如下conf文件:
LoadModule Mine_module /etc/httpd/dev_modules/mine.so
<Directory "/var/www/html/api/v9.1">
apiHost localhost
apiPort 2024
SetHandler mine
LogLevel info
</Directory>
<Directory "/var/www/html/api/v9.2">
apiHost host2
apiPort 2025
SetHandler mine
LogLevel info
</Directory>
我的希望是,由于目录不同,对 /api/v9.1/user 的任何调用都会与 localhost/2024 上运行的服务器通信,而对 /api/v9.2/user 的调用将调用 host2/2025 上的服务器。 但是,对 v9.1 或 v9.2 的任何请求都会导致配置文件中最后列出的主机/端口组合。 这是一个特定于模块的conf文件,但也许需要以不同的方式调用它? 该文件位于conf.modules.d 目录中。 有人可以让我知道我做错了什么以及是否有办法做到这一点?
我发现了我的问题。 它不在配置文件中;它在我的指令结构中。 我将指令结构的总体从 http 行移动到每个目录行,如下所示:
module AP_MODULE_DECLARE_DATA Mine_module = {
STANDARD20_MODULE_STUFF,
create_mine_dir_config, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
mine_directives, /* table of config file commands */
Mine_register_hooks /* register hooks */
};
添加对 create_mine_dir_config 的调用后,模块开始获取正确的值。