tid=101068&以下是gist.github.com支援reverse proxied APIs的範例:
% ?0 W) T1 }8 x* |, u8 q- C( O$ ^4 F1 a8 R) G. q
4 l) C2 r) w* C* s
# CORS header support( w$ {) F- b$ B/ O' q' J. \
#! H( ]9 F" a! H, v6 _/ e
# One way to use this is by placing it into a file called "cors_support"
* I2 i2 H8 d6 w+ n# under your Nginx configuration directory and placing the following) x7 \' t8 \7 T
# statement inside your **location** block(s):
+ E9 b' o; A j5 @$ M4 k m9 w#3 I2 I- b. f# A: @' c
# include cors_support;6 G5 \. o# z. B) }3 G; q8 V
#
$ j: N9 u3 U+ Y5 r# As of Nginx 1.7.5, add_header supports an "always" parameter which
) Q; t: k3 a7 r# allows CORS to work if the backend returns 4xx or 5xx status code./ o z& {8 d2 R5 G: E1 ^
#
5 v" L- V" l# p$ Z2 l# For more information on CORS, please see: http://enable-cors.org/, A. c! o, @6 T9 e# z- c! J
# Forked from this Gist: https://gist.github.com/michiel/1064640
$ B) F6 ^; |# ~ Y" u. S$ ~; h#
. o! Y4 m! q4 G) @6 m) h8 ~& d) U' C1 j3 W3 ~1 R0 T
set $cors '';8 z" {$ ?+ ]: i$ N0 P2 [
if ($http_origin ~ '^https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)$') {
0 j: y& u! L; ^ set $cors 'true'; @. n$ x1 h* g. o
}
+ d, a! H, f" ^) s% B7 S
. c0 K" H$ g8 vif ($cors = 'true') {
3 k) [- j1 I# o1 x. A" } add_header 'Access-Control-Allow-Origin' "$http_origin" always;
" m v/ u' e: G, E1 v5 [1 K, ^ add_header 'Access-Control-Allow-Credentials' 'true' always;
0 Q0 i/ z# e2 v add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
: t& Z0 w$ _/ y7 R3 V 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;
& A* n+ A- f2 s% c8 y # required to be able to read Authorization header in frontend
0 j6 b" l7 _+ M6 A #add_header 'Access-Control-Expose-Headers' 'Authorization' always;( [6 i ?" W6 l4 U
}) @0 A+ T+ X* C+ i, M7 @0 g# k5 N
1 c8 o& B7 x# L
if ($request_method = 'OPTIONS') {
1 p5 H5 j' G( G" a # Tell client that this pre-flight info is valid for 20 days# f2 l# a* W5 F8 X2 S
add_header 'Access-Control-Max-Age' 1728000;
) D8 ]. i5 g0 W1 T add_header 'Content-Type' 'text/plain charset=UTF-8';
5 h! x; f% ^ f y5 z- M add_header 'Content-Length' 0;
v$ g& I! B+ ~: x* c return 204;
8 U. B7 _. |+ l} https://gist.github.com/Stanback/7145487#file-nginx-conf 的討論範例:
/ z+ H$ ]8 Q7 R: e% q# g. aif ( $request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|PATCH|DELETE)$ ) { return 444;6 a& W5 ^4 p9 j" W* G+ ]
}! T+ L" A) s# ^
set $origin $http_origin;+ @0 q/ ?! g ]; P) n
if ($origin !~ '^https?://(subdom1|subdom2)\.yourdom\.zone$') {/ Y. K5 z% a C h
set $origin 'https://default.yourdom.zone';+ N* L- b3 D1 w ]
}1 O2 t1 S. O/ J$ @; k
if ($request_method = 'OPTIONS') {
8 n, `9 O7 P8 x5 @) ~) s$ } add_header 'Access-Control-Allow-Origin' "$origin" always;- o7 z5 q3 [) v! V0 k
add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;' r6 s/ q8 m8 u C8 v2 Y
add_header 'Access-Control-Allow-Headers' 'Content-Type, Accept, Authorization' always;% [( J1 s+ n- c" m
add_header 'Access-Control-Allow-Credentials' 'true' always;. ?0 h5 m# v" K3 ? M* w
add_header Access-Control-Max-Age 1728000; #20 days - u7 F/ I/ }6 W. G+ W2 m% z0 G" B
add_header Content-Type 'text/plain charset=UTF-8';
: ]1 i4 z4 a I# Z6 j3 r1 ] add_header Content-Length 0;
1 x$ M0 b9 f* ?- N* w% ` return 204;
: Z6 Q: H/ \) x, A}
* h9 H1 J! ?/ v5 g' ~$ A# Zif ($request_method ~ '(GET|POST|PATCH|PUT|DELETE)') {. r: Y: E& N' ]3 `+ \# S
add_header Access-Control-Allow-Origin "$origin" always;0 E: \ d v) A- \, u
add_header Access-Control-Allow-Methods 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
( n# F+ U2 Q2 c# D3 Q4 D add_header Access-Control-Allow-Headers 'Content-Type, Accept, Authorization' always;
5 x2 Y6 D# b" X; S I add_header Access-Control-Allow-Credentials true always;
* y4 D* ^( W! c. n} Access-Control-Allow-Origin Multiple Origin Domains? 的例子:# based on https://gist.github.com/4165271/, b- G6 F, O' W: }9 i4 g6 P" |
#1 R- W; d' ~- B; x3 w5 ]- D* ?
# Slightly tighter CORS config for nginx
% t0 ]/ F9 h# t! q$ V q$ \1 V#& f* V8 H- ^3 j3 ]
# A modification of https://gist.github.com/1064640/ to include a white-list of URLs& F7 H- R9 ~+ P9 U, S/ T
#
& J8 _% K5 C$ t& V6 x# Despite the W3C guidance suggesting that a list of origins can be passed as part of& M( E( c) q+ Q
# Access-Control-Allow-Origin headers, several browsers (well, at least Firefox)
/ C6 ^ Q- x9 w, K- \- F: Y% h# don't seem to play nicely with this.- c7 g9 C: r: u) m1 x
#
0 b$ G, ?' B) Y4 C, Z1 J9 n9 [# To avoid the use of 'Access-Control-Allow-Origin: *', use a simple-ish whitelisting
+ w# I% I, X3 ?; ~. y# v: `# method to control access instead.4 u- v% F# t9 u O
#) b5 U/ H9 ^" _0 a, X
# NB: This relies on the use of the 'Origin' HTTP Header.! f( F. ^7 l& X9 a: {+ G
4 d$ u4 B5 w. u) ], o( q) G glocation / {5 f }& E! D2 a' t
" H! W- b6 K" P- I! W1 z
if ($http_origin ~* (^https?://([^/]+\.)*(domainone|domaintwo)\.com$)) {. O6 l3 y7 {$ X
set $cors "true";. f4 {, i" {3 o7 A$ @/ q8 \! u% H
}
, q6 z6 g3 Z$ E4 z. K
" i* O) i. Y3 ]! L, ` n4 Q; {. a # Nginx doesn't support nested If statements. This is where things get slightly nasty./ |3 D |0 m9 Z/ N7 C
# Determine the HTTP request method used
: w5 E! ]+ P7 ^! S1 p9 e if ($request_method = 'OPTIONS') {
+ i- N. v9 f. E! R- N( ~: } set $cors "${cors}options";3 U3 |! S# Z1 g E
}: M8 ^* n T1 X1 S/ h* |
if ($request_method = 'GET') {
, D7 _# p% ?# K7 s set $cors "${cors}get";9 K: m/ Z: r: R' h5 ]4 @0 R* s9 F
}
& D( v, k7 S0 {' O- Y1 U if ($request_method = 'POST') {
/ I) e. L, U' K' o1 {; G% N+ c, c3 p$ X set $cors "${cors}post";
5 j: v9 G6 @2 p: C/ B& U }- V' |2 ^# V7 ]/ l" M
( c% o! a s# o5 l h, f8 W4 P2 O$ J
if ($cors = "true") {
+ a% D1 ]9 N8 i. F2 C( G. h # Catch all incase there's a request method we're not dealing with properly# E: l" Q8 X4 C7 W" {, _3 J
add_header 'Access-Control-Allow-Origin' "$http_origin";
: V7 z9 v, L& N1 r }
' g5 M& [, E5 Q1 g3 h" o0 V
; L' k- n3 b/ x' ^ if ($cors = "trueget") {3 T! ]% c* }" d2 ] x5 V
add_header 'Access-Control-Allow-Origin' "$http_origin";- P f, G1 c: j) l$ E8 e1 T
add_header 'Access-Control-Allow-Credentials' 'true';! I! F. G- l- a9 [$ \( f" r2 A) `; z
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
" [( F/ ^) w/ m+ i add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
$ a% ?4 o4 q; n% [1 d, l, a( v }
1 k+ w7 h G3 R. h% Q; F! |. W$ b% ?% I
if ($cors = "trueoptions") {0 u3 L& n+ \, Y
add_header 'Access-Control-Allow-Origin' "$http_origin";
/ x: |- e$ @- C5 r+ r+ I. }5 a8 K3 l9 @8 _; I' s/ {4 S$ H
#
; i' L+ ~' N7 k( Z # Om nom nom cookies6 J/ b4 n$ ?! s# O# c. x
#8 k# Q6 g8 U! V+ E' {2 t1 g
add_header 'Access-Control-Allow-Credentials' 'true';+ {) C. X: m3 o
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';! c( J, G: _( ^1 M% ]- u# ]
& u2 N `# ` S9 p0 M1 n/ R2 x. | #- j, l. A4 i& G8 v7 ~
# Custom headers and headers various browsers *should* be OK with but aren't
* F2 ^- e) B) {4 Q, @4 c #
2 l- } B* x* f) R/ x( \ add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
! |1 g G9 z7 z+ c3 m6 N X( W% v! e; f; k) R5 t1 O3 o$ K
#
( }- |% Y) `; n# M: Q& O+ ? # Tell client that this pre-flight info is valid for 20 days* c8 l6 F* V4 }' ]
#9 J" Y# k/ |' n9 v( P
add_header 'Access-Control-Max-Age' 1728000;
. s3 t3 t8 `' y/ ` add_header 'Content-Type' 'text/plain charset=UTF-8';
" F% p6 _3 J @' m1 H2 J add_header 'Content-Length' 0;! [' c# z U1 f" Y+ A3 x. T) F
return 204;
( b& n N+ C4 ^# c% q. X+ [. R }
& z5 E* s$ C2 }" o8 X8 d4 T
5 o6 f3 |: X* }+ _1 z if ($cors = "truepost") {. ^% k% @+ o8 d! R. h" D/ D
add_header 'Access-Control-Allow-Origin' "$http_origin";
# ?/ C7 K- m0 C @. A Z2 F add_header 'Access-Control-Allow-Credentials' 'true';' _6 E* ~! q0 N* `- F! T& Q
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';( k1 ^2 A4 C) u& ~% L/ b9 c
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';' p* `: n' g* L, B$ G, c+ Z: d$ q/ O
}" Z2 _8 J) c+ \2 @
) H: S1 C$ { K
} ) p: I8 F# N2 s. W
: V! B3 H! l3 W" v" f* E
|