記錄 openresty+nginx 網關(跨域配置不生效問題)
- 跨域本身對于
nginx來說都是小問題,只需要添加一些配置,例如:
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
}
就能解決了。
- 一般自己寫網關都是會進行一些自定義操作比如鑒權等操作。例如:
rewrite_by_lua_block {
local cjson = require "cjson"
local dis = require "auth.dispatcher"
-- 檢測路由
ngx.var.service, needCheckToken = dis.GetServiceURL(ngx.var.request_uri)
ngx.log(ngx.WARN, 'location ngx.var.service:', ngx.var.service)
if not needCheckToken then
return
end
-- 校驗token
local info = dis.verify_token()
if not info.verify then
ngx.say(cjson.encode(info))
return ngx.exit(401) -- 問題就出現(xiàn)在這里,直接返回了。
-- return ngx.HTTP_UNAUTHORRIZED
end
-- 設置該請求的UID
ngx.req.set_uri_args({uid=info.userid})
}
ngx.exit()方法會直接打回請求,什么都不做,我們在nginx配置文件寫的其他配置也不會生效。這就導致了我們明明做了跨域配置卻不生效
類似與GOLANG里面的os.exit,defer也不執(zhí)行了。直接退出
這里使用 ngx.HTTP_UNAUTHORRIZED代替ngx.exit(401)就可以了。
借鑒