nginx配置妙用map自定义全局变量,在server块(段)中能用

通常情况下,定义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)。

本文由@大鱼原创发布于今日指点,转载请附带链接。

本文链接:https://www.jinrizhidian.com/tech/1384.html

发表评论