# # Slightly tighter CORS config for nginx # # Despite the W3C guidance suggesting that a list of origins can be passed as part of # Access-Control-Allow-Origin headers, several browsers (well, at least Firefox) # don't seem to play nicely with this. # # To avoid the use of 'Access-Control-Allow-Origin: *', use a simple-ish whitelisting # method to control access instead. # # NB: This relies on the use of the 'Origin' HTTP Header.
location / {
if ($http_origin ~* (whitelist\.address\.one|whitelist\.address\.two)) { set$cors"true"; }
# Nginx doesn't support nested If statements. This is where things get slightly nasty. # Determine the HTTP request method used
if ($request_method = 'OPTIONS') { set$cors"${cors}options"; } if ($request_method = 'GET') { set$cors"${cors}get"; } if ($request_method = 'POST') { set$cors"${cors}post"; }
if ($cors = "true") { # Catch all incase there's a request method we're not dealing with properly add_header 'Access-Control-Allow-Origin'"$http_origin"; }
if ($cors = "trueget") { add_header 'Access-Control-Allow-Origin'"$http_origin"; add_header 'Access-Control-Allow-Credentials''true'; 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'; }
if ($cors = "trueoptions") { add_header 'Access-Control-Allow-Origin'"$http_origin";
# # Om nom nom cookies #
add_header 'Access-Control-Allow-Credentials''true'; add_header 'Access-Control-Allow-Methods''GET, POST, OPTIONS';
# # Custom headers and headers various browsers *should* be OK with but aren't #