我有多个虚拟主机,由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;
...
}
include
是server
指令的直接子指令,也就是说,include. Earlier, instead of the
include行周围没有其他内容,主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中的代码是无效的。