nginx 结合map配置跨域
map指令使用ngx_http_map_module模块提供。nginx默认会加载这个模块,需要手动指定 --without-http_map_module
#语法
map $var1 $var2 { ... }
map为一个变量设置映射表。映射表由两列组成,匹配模式和对应的值
匹配模式可以是一个简单的字符串或者正则表达式
正则表达式如果以 “~” 开头,表示对大小写敏感。以 “~*” 开头,表示对大小写不敏感
map $http_user_agent $agent {
default "";
~curl curl;
}
map指令的三个参数:
default:没有匹配结果将使用的默认值。如果没有设置 default,将会用一个空的字符串作为默认结果
hostnames:允许用前缀或者后缀掩码指定域名作为源变量值。这个参数必须写在值映射列表的最前面
include:包含一个或多个含有映射值的文件
// 示例1
// 匹配请求 url 的参数,如果参数是 from 则设置 $origin = 1 ,默认设置 $origin = 0
map $args $origin {
default 0;
from 1;
}
// 说明
$args 是nginx的内置变量,用于获取请求 url 的参数
如果 $args 匹配到 from 那么 $origin 的值会被设为 1
如果 $args 一个都匹配不到,$origin 会使用default 定义的默认值 0
#示例2
实现允许多个域名跨域访问
// 配置单域名跨域访问
// server段直接添加以下代码
#add_header Access-Control-Allow-Origin "*"; //表示支持所有域名跨域访问,生产环境不推荐
add_header Access-Control-Allow-Origin "http://api.share.cn";
add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept;
// 允许多域名跨域访问
map $http_origin $corsHost {
default "";
"~http://go.share.cn" http://go.share.cn;
"~http://api.share.cn" http://api.share.cn;
}
// server添加以下代码
add_header Access-Control-Allow-Origin $corsHost;
add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept;
#示例3
使用源变量匹配一些规则,映射到自定义变量,然后在页面输出(常用于调试)
map $uri $params {
~^/test/(.*) http://api.share.cn/;
}
server {
listen 80;
server_name api.share.cn;
location /test {
default_type text/plain;
echo uri: $uri;
echo param: $params;
}
}