如何将验证移到通用文件中并导入



我有多个虚拟主机,由Nginx管理。

我收到一张通知单,要求我验证某些虚拟主机的请求标头的值,如果标头不存在或无效,则拒绝服务请求。这是我添加到每个虚拟主机的内容:

location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}

这正如预期的那样起作用。然而,我打算让这个解决方案更优雅,并创建一个新的配置文件,名为common.conf,并且,不是将相同的代码粘贴到所有虚拟主机中,而是包括这个公共文件,如:

include conf.d/common.conf;

然而,我的尝试都失败了:

第一次尝试

粘贴if条件并将location指令保留在虚拟主机中,这将include文件。我收到的错误在日志中告诉我,我不能在文件中单独使用if

第二次尝试

我已经移动了整个

location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}

并在虚拟主机配置中将其替换为CCD_ 5。我收到的错误告诉我,我需要将server指令包装在location指令周围。

第三次尝试

我已经将一个服务器指令封装在我的位置指令中,但也出现了错误。我不再有错误,因为从那以后我销毁了服务器并重新创建了它。但如果需要确切的错误消息,请告诉我,我会重新生成并在这里共享。

问题

如何创建一个通用配置文件来验证请求标头并将其包含在多个虚拟主机配置中?

编辑

鉴于Rahul Sharma的回答,我将提供当前尝试的进一步信息。这就是目前主会议的样子:

server {
...
include conf.d/common.conf;
...
}

includeserver指令的直接子指令,也就是说,include. Earlier, instead of theinclude行周围没有其他内容,主conf有它的内容,比如

server {
...
location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}
...
}

它奏效了。我实际上已经将location /移到了common.conf文件中,并用include替换了它。所以,Nginx出于某种原因不喜欢我的另一个文件。这就是为什么这对我来说很奇怪,这也是我问这个问题的原因。

我假设conf.d/common.conf文件的内容是:

location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}

错误

"位置";/etc/nginx/conf.d/common.conf 中不允许使用此指令

是因为主nginx.conf中的include语句可能放错了位置。行include conf.d/common.conf;应该在server块内,以便像这样工作:

server {
...
...
include conf.d/common.conf;
...
...
}

原来在nginx.conf中有一行

include /etc/nginx/conf.d/*.conf;

它在另一个我不知道的地方包含了common.conf,而在第二个地方common.conf中的代码是无效的。

相关内容

  • 没有找到相关文章

最新更新