通常情况下,定义nginx全局变量可以使用set指令,但是,当你在http块(段)中使用set时,会看到如下错误:
"set" directive is not allowed here in ...
出现这个错误的原因是:http块下不能用set定义变量。
那怎么办呢?我想在http块中定义网站顶级域名,比如顶级域名是example.com,然后在http块中以及server块中都可以引用,该如何弄?实际很简单,map指令可以解决。
map
指令是Nginx配置中的一个非常有用的指令,它用于创建映射表,将输入值映射到输出值。这可以帮助你在配置中实现条件性的操作,如根据域名、请求路径或其他条件来选择不同的处理方式。以下是map
指令的基本用法:
map $input_value $output_value {
input_value_1 output_value_1;
input_value_2 output_value_2;
default default_output_value;
}
map指令的语法有点类似编程中的switch…case…,但如果定义的变量值是固定的,我们只需要default就行了,下面是关于使用map指令定义变量的完整示例:
# 定义网站顶级域名,变量名为$my_domain
map $host $my_domain {
default "example.com";
}
# 定义ssl证书路径
map $host $ssl_cert_path {
default cert/$my_domain/$my_domain.pem;
}
# 定义ssl证书私钥文件的路径
map $host $ssl_key_path {
default cert/$my_domain/$my_domain.key;
}
server {
server_name example.com www.example.com;
listen 80;
return 301 https://$my_domain$request_uri;
}
server {
server_name www.example.com;
listen 443 ssl http2;
ssl_certificate $ssl_cert_path;
ssl_certificate_key $ssl_key_path;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
return 301 https://$my_domain$request_uri;
}
server {
server_name example.com;
listen 443 ssl http2;
ssl_certificate $ssl_cert_path;
ssl_certificate_key $ssl_key_path;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
root /webpath/$server_name;
access_log /webpath/$my_domain.log;
######
}
这个配置中,我们定义了顶级域名变量$my_domain,然后证书、root路径以及日志文件路径的地方都可以引用这个变量了,是不是很奈斯(nice)。
本文由@大鱼原创发布于今日指点,转载请附带链接。