tid=101068&以下是gist.github.com支援reverse proxied APIs的範例:5 u) @% }7 c. Z+ ~
" t4 B6 t, y* v" J, W/ U
9 y# r0 T' i9 a. i Y$ o# CORS header support. X3 a' x L: H( m# l: h' V8 A- F
#
7 b% a# `! M! [' x% O0 T# One way to use this is by placing it into a file called "cors_support"
4 N% G9 r. n) n7 |" a1 k0 u b# under your Nginx configuration directory and placing the following% H0 b) K( z7 N2 G
# statement inside your **location** block(s):
; [: j& e5 q4 p3 t5 g$ w( X6 B#, |' H; [: V- M: r3 B" f( o
# include cors_support;
3 M& u% T0 _ M#
2 \. Q6 U9 ~) i- E) I+ Q# As of Nginx 1.7.5, add_header supports an "always" parameter which1 p+ j7 C/ b( a; v: G
# allows CORS to work if the backend returns 4xx or 5xx status code.
4 y6 ~" ?; _9 E1 X#
' P* d# z# |: B5 h# For more information on CORS, please see: http://enable-cors.org/" u8 e/ a P7 `
# Forked from this Gist: https://gist.github.com/michiel/1064640
# ?# f; f5 n8 n#
5 i- s2 D5 Q1 F7 k8 i1 p9 z" M
9 O- W" d! T$ z+ i" n* ^' Qset $cors '';
p2 D; u1 ?& j( Z& dif ($http_origin ~ '^https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)$') {
, [- \# P: H1 L6 R' o# @ set $cors 'true';& Y: d$ n# ~2 @2 ]2 C* N$ u) w
}0 X" \! r) G( ^! O
1 c5 z- g! K) A5 aif ($cors = 'true') {
. O, K* u& L! y- i1 Z add_header 'Access-Control-Allow-Origin' "$http_origin" always;+ h0 z: d5 ^1 r5 b
add_header 'Access-Control-Allow-Credentials' 'true' always;
3 S& |% j! a! n" w6 l' a add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;- K& [$ t! O2 m; J
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
# t: q. s( S$ p+ w' A2 d1 f4 ] # required to be able to read Authorization header in frontend
" F ]6 {+ [5 f4 a+ u$ e) u #add_header 'Access-Control-Expose-Headers' 'Authorization' always;% f& _7 B, ^5 M% f. F& z
}
, p" T! c! y X0 b+ |
v( M0 j" G' K3 Pif ($request_method = 'OPTIONS') {6 P6 @" y/ g. X4 `7 P
# Tell client that this pre-flight info is valid for 20 days
3 h: l' |% C1 t add_header 'Access-Control-Max-Age' 1728000;9 n) y$ W, K4 `) N8 D
add_header 'Content-Type' 'text/plain charset=UTF-8';
" @* g% S) ^" P/ O' f4 i, c add_header 'Content-Length' 0;
5 r0 R$ @. j3 A# U6 z4 Z p Y return 204;! j; y+ L6 K" X$ |8 f
} https://gist.github.com/Stanback/7145487#file-nginx-conf 的討論範例:
/ `4 e2 m# W3 P$ E' p7 z2 Uif ( $request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|PATCH|DELETE)$ ) { return 444;* M; l! w3 B3 C& S0 W
}& o/ i+ S' h: H
set $origin $http_origin; ?" y' ~6 u3 _# S" h/ H
if ($origin !~ '^https?://(subdom1|subdom2)\.yourdom\.zone$') {
/ ?' I3 F4 _: I1 u5 R/ l set $origin 'https://default.yourdom.zone';
1 _% J0 R h2 B+ L6 _/ x" R}: Q" A% Y) @) H9 B# f! U$ z
if ($request_method = 'OPTIONS') {
+ Z8 } r6 v$ X9 ^ add_header 'Access-Control-Allow-Origin' "$origin" always;
% B* Q8 V& U0 g add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
& h& C4 ]" \! O" y! ^ add_header 'Access-Control-Allow-Headers' 'Content-Type, Accept, Authorization' always;4 c3 E( v- i. I# f- E$ S
add_header 'Access-Control-Allow-Credentials' 'true' always;
: ?' z2 Z; y) s" y. ` v3 S add_header Access-Control-Max-Age 1728000; #20 days ! I/ f0 v8 P* q3 v c; r$ A f
add_header Content-Type 'text/plain charset=UTF-8';
3 ]9 ?6 z. G# M. H add_header Content-Length 0;
) p( ^$ G P j8 F0 D* P5 d return 204;$ \' P+ U6 ~, ^" L" o0 \
}% c! z. l; _% w( {6 g
if ($request_method ~ '(GET|POST|PATCH|PUT|DELETE)') {; i0 t/ w8 E. ]) {6 h# n
add_header Access-Control-Allow-Origin "$origin" always;
8 `9 _2 r1 u3 y add_header Access-Control-Allow-Methods 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;& o' ^: h# l3 o2 r- d u1 e
add_header Access-Control-Allow-Headers 'Content-Type, Accept, Authorization' always;
9 X8 S9 z( d0 K: |( e7 C3 q add_header Access-Control-Allow-Credentials true always;; r& G& W2 Z/ L( y$ V
} Access-Control-Allow-Origin Multiple Origin Domains? 的例子:# based on https://gist.github.com/4165271/* V5 u- M0 K& d# n6 [
#$ N) v" k( _+ b J
# Slightly tighter CORS config for nginx
' v) b, b6 _3 A#9 Q1 b+ I9 X8 \) }2 p2 U
# A modification of https://gist.github.com/1064640/ to include a white-list of URLs! |1 _! X2 M G
#
7 M* [) r& F# g3 ^0 i+ }# Despite the W3C guidance suggesting that a list of origins can be passed as part of1 U& B4 R- c" K$ [4 Y1 `3 B
# Access-Control-Allow-Origin headers, several browsers (well, at least Firefox)% w! T6 f: e5 ~% v
# don't seem to play nicely with this.
7 S( ^0 o2 \- W3 e Q$ Y! z6 z* o#
2 K+ g8 h# @, d4 U# To avoid the use of 'Access-Control-Allow-Origin: *', use a simple-ish whitelisting2 B* M* k* Y% @2 q% g7 p! T' N
# method to control access instead.
8 S# ?( @- N" g. w( D#0 d4 S& {8 r5 R; |7 H/ D
# NB: This relies on the use of the 'Origin' HTTP Header.& y4 D' _3 h3 T
! p/ ~ M6 N: E/ e, ~' V
location / {
, j7 N1 C! ~; K; R* X) i8 k5 l4 A, \% t O
if ($http_origin ~* (^https?://([^/]+\.)*(domainone|domaintwo)\.com$)) {0 D O5 b( H& n
set $cors "true";
# r$ p* ]' }: j6 N }
- c3 u# J3 B! L6 `3 n
3 n3 G. L0 L! e* ?+ p8 g! K9 J # Nginx doesn't support nested If statements. This is where things get slightly nasty.$ U1 _9 S n6 z8 N& s5 O
# Determine the HTTP request method used
, x1 q/ c! ?0 q7 f$ L& K* c if ($request_method = 'OPTIONS') {
) u i- _" q$ Z% I# o# c set $cors "${cors}options";
, C! Y- G8 I# Z/ X }
9 u9 C! D( D) w# f if ($request_method = 'GET') {
" P8 H$ g/ l5 ~0 O I9 X set $cors "${cors}get";" u( B g8 n$ {; e# m4 o6 c$ q' I
}
! O- j1 G. d7 L: n' v/ T4 s if ($request_method = 'POST') {. t) P' S" |0 O
set $cors "${cors}post";* T9 d. r* s: s
}* a2 ~: H. u0 x D% F( t2 A) r* w
- e0 \# t) j- k/ P$ A9 m. D8 {5 v if ($cors = "true") {
. v+ [. V) h6 N3 f6 @- }) | # Catch all incase there's a request method we're not dealing with properly' I% S5 h1 _) F- ^! C
add_header 'Access-Control-Allow-Origin' "$http_origin";3 Y3 x a/ L/ J/ t
}
9 W2 W5 t# X1 G! T4 M6 c) U, M+ Y' Q, i
if ($cors = "trueget") {7 Y g, d# B% Q, g2 X+ T9 ?$ U6 Y% U
add_header 'Access-Control-Allow-Origin' "$http_origin";) K2 n, L! [; l! c
add_header 'Access-Control-Allow-Credentials' 'true';
5 w( Y# b! j1 O add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
- R) C% v3 a' n, d0 H6 Q( _# A. s add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';; v7 c) v- m7 ?, l6 T- ~0 }3 |
}4 N$ C/ a0 M* u+ ^
& Y# b+ W4 j9 c0 _4 Y- A7 o4 O if ($cors = "trueoptions") {" b# f' _4 V0 B% J, J% i, a4 K$ ^
add_header 'Access-Control-Allow-Origin' "$http_origin";
; W2 i# H8 \! y% v/ \0 z3 x, f# J1 m. b3 u/ u+ ^2 b7 U
#% E" x0 l9 {. I3 z3 i( Z0 p& R* Q
# Om nom nom cookies9 X+ }8 x4 j5 h7 h; G/ V
#1 a! r N$ X2 x. Y! w2 m' B6 j( b
add_header 'Access-Control-Allow-Credentials' 'true';4 O. n0 e' j' ?: J3 G
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
. y! c2 n9 N2 V% g2 }! e, D# l- @" c4 F. O. P- Z
#
+ b6 ^" a4 w3 F- O5 H; a7 ?* y # Custom headers and headers various browsers *should* be OK with but aren't
4 k6 n+ q% L/ o8 G- `7 E #/ r) R% B& \5 h: _8 j
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
& A2 r" l. p- @ u! s! g; e: W$ D4 t. C3 @7 }
#
' A. X$ S) {7 U/ w8 _4 Z/ R* h' } # Tell client that this pre-flight info is valid for 20 days
& v4 q5 v5 N; G3 S/ k( c: M #, y% v/ n' j: ^; R+ J1 g4 B; V2 M
add_header 'Access-Control-Max-Age' 1728000;
) m8 S2 Q* o3 W i$ U add_header 'Content-Type' 'text/plain charset=UTF-8';- Y7 K% t* w9 W# c4 p& `7 i2 m
add_header 'Content-Length' 0;" E y5 a+ g S" x3 I8 T! P
return 204;1 V% C, D+ ^$ ]3 V* h0 c
}
! X3 q; V: s3 Z) e: t7 B. ?$ W5 B( q1 }. n: N6 n( {; P
if ($cors = "truepost") {
& ~- F2 H8 ~+ i% V add_header 'Access-Control-Allow-Origin' "$http_origin";
+ v5 c& u; p* P4 D5 N add_header 'Access-Control-Allow-Credentials' 'true';- h6 G1 X2 ~# h: V
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';2 {7 U9 J1 t4 q; P
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
/ \2 C9 q. e" v Y3 ?2 ^* R' { }
' X; u; p/ A1 E8 L1 w6 Y: L% ]. m5 `8 o: h' |$ ^+ |0 t
}
+ V+ _/ s2 k; U4 P. u @/ u/ v( S& o: L+ o
|