以下是gist.github.com支援reverse proxied APIs的範例:
0 ?7 L r1 Q6 Q: P, q, b0 ]# B
, L# R% h% T! [+ d/ K% I% G ]
6 x( k3 g+ Z% H5 K/ V# m% x* g* E# CORS header support! g' u9 J" S0 C1 t o( u
#
" r* u$ P: V; H d8 H3 F# One way to use this is by placing it into a file called "cors_support"+ r8 b1 _' C- h
# under your Nginx configuration directory and placing the following
6 s; v* f4 L3 G4 J/ z# statement inside your **location** block(s):4 i% y) P( a% {) ~5 R: n3 U; H# x
#1 T% |9 o$ n' e4 w" }
# include cors_support;( f$ w6 I! S# v- E$ b
#
- W3 D. i3 w* m4 f# Q5 H0 C1 c# As of Nginx 1.7.5, add_header supports an "always" parameter which/ u% c0 w. o7 s+ M
# allows CORS to work if the backend returns 4xx or 5xx status code.$ J7 p5 r% Y' ~( h; R
#' j' P/ e2 a& D$ V9 x
# For more information on CORS, please see: http://enable-cors.org/
9 {% {# W! s. ?% T# Forked from this Gist: https://gist.github.com/michiel/1064640& v& W5 G5 }0 j# H
#6 O; `4 t0 u- P
" C! }8 X) D9 I7 G+ j) |
set $cors '';1 s* U/ |2 B, u( V/ M$ ?4 B
if ($http_origin ~ '^https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)$') {$ [2 Q, q' Z7 U; J
set $cors 'true'; s& I f7 n' s; B) b( y4 q$ P
}" b# n7 S9 S+ s
5 v$ w; ~( q- V E% ]3 m0 Tif ($cors = 'true') {4 w, w6 |8 S" a: B3 P' E# e
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
( i9 n7 s6 n3 J: K/ ]; ]2 d2 r0 o add_header 'Access-Control-Allow-Credentials' 'true' always;& X+ b, B" j9 r6 N3 H
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;( i" a* Q" M; o* X& \. q3 i- O
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;
/ |/ u2 C$ M9 w$ S9 C # required to be able to read Authorization header in frontend4 H2 ^" I* w1 |, w- g0 Y
#add_header 'Access-Control-Expose-Headers' 'Authorization' always;2 \0 e$ ^$ @* d: k
}
. [/ }- S j; I, `' O7 Z; J" l: B' N# _
if ($request_method = 'OPTIONS') {
! ]+ h7 d) S9 U9 e # Tell client that this pre-flight info is valid for 20 days! O; o6 F$ e) @" E: G, V7 _0 {! q D
add_header 'Access-Control-Max-Age' 1728000;' k7 O1 e/ @4 G) d8 }
add_header 'Content-Type' 'text/plain charset=UTF-8';: X7 ^6 y& W4 \3 s9 T8 ]% z' J4 t
add_header 'Content-Length' 0; H( `8 h! C$ m) l. s# f
return 204;
. u/ p4 B V% M! x4 r1 b} https://gist.github.com/Stanback/7145487#file-nginx-conf 的討論範例:
8 ?, w/ N3 W' e! @. Y2 a. @( P5 U3 Iif ( $request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|PATCH|DELETE)$ ) { return 444; h+ O8 O) j2 i- W( c7 o
}- L/ Q1 |6 D3 i& G
set $origin $http_origin;
1 K* Q4 E! n+ iif ($origin !~ '^https?://(subdom1|subdom2)\.yourdom\.zone$') {
8 X R- B) L! [ set $origin 'https://default.yourdom.zone';
; R' Z: ~: B$ N}! p) A& d0 S; i! S/ n: m+ E
if ($request_method = 'OPTIONS') {' l' Q! T/ Y2 a
add_header 'Access-Control-Allow-Origin' "$origin" always;
8 s6 b4 ]7 ^9 T% ~ add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;% S @* A4 @- e' f% |+ \& t' y
add_header 'Access-Control-Allow-Headers' 'Content-Type, Accept, Authorization' always;- Q, O$ g0 @, b, L
add_header 'Access-Control-Allow-Credentials' 'true' always;
/ c) u. j! T- U2 C. \ d add_header Access-Control-Max-Age 1728000; #20 days $ |1 S/ n: h; J$ K; ~5 G3 t3 D/ P$ V
add_header Content-Type 'text/plain charset=UTF-8';
& }5 f. F- U$ }; _5 l add_header Content-Length 0;1 Y0 w, d1 N; U. _& m7 ?' J. q
return 204;# H$ w% u1 @: k' {' N( b
}" M% Q! a, t; L
if ($request_method ~ '(GET|POST|PATCH|PUT|DELETE)') {0 b5 e1 a* t7 k% g3 a. W' ]
add_header Access-Control-Allow-Origin "$origin" always;9 E6 ^8 n" B+ \, W+ o8 i3 w8 K# f& r
add_header Access-Control-Allow-Methods 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
1 `6 V2 c9 O+ m1 l4 J$ V add_header Access-Control-Allow-Headers 'Content-Type, Accept, Authorization' always;
- s5 R6 f- g/ L R4 s2 v/ F9 _$ [8 \ add_header Access-Control-Allow-Credentials true always;2 c% ? ]% |& P' ~: p/ L) f( Z
} Access-Control-Allow-Origin Multiple Origin Domains? 的例子:# based on https://gist.github.com/4165271/8 i+ J5 m; ~; H
#" G1 x3 Z" _1 s8 Y
# Slightly tighter CORS config for nginx8 ~3 m) [" |- A$ R+ j
#
! p7 E8 @; a, O- @) H R# A modification of https://gist.github.com/1064640/ to include a white-list of URLs
$ F: q4 W3 T" ?#7 B- V8 i/ K/ w4 T9 B0 V
# Despite the W3C guidance suggesting that a list of origins can be passed as part of' B1 ^8 u* e- s& V& l4 \9 W
# Access-Control-Allow-Origin headers, several browsers (well, at least Firefox)
( Z8 e5 C8 s9 p! J# don't seem to play nicely with this.% j4 @! X1 @' T0 j- O' D0 F& j
#
6 U# b5 S+ v9 }! k2 m7 G7 d0 {# To avoid the use of 'Access-Control-Allow-Origin: *', use a simple-ish whitelisting: V1 G/ U$ [" X$ j7 x+ d X
# method to control access instead.
1 c$ e1 `1 D) p5 W#) N( H& f& }: n7 ~6 o1 `) p6 t2 x1 Z
# NB: This relies on the use of the 'Origin' HTTP Header.- h2 h! Q* I. }0 p
) L) V! a8 g9 r; d
location / {& B$ `8 L# ^5 l3 D9 @( P, R
& u" P/ L" A. z& n& }/ T- |! U if ($http_origin ~* (^https?://([^/]+\.)*(domainone|domaintwo)\.com$)) {) C. @( O' _' T/ d5 N* ?# b
set $cors "true";$ I' S$ Q1 Z0 u2 D" B) v- ^) K
}
1 W4 I. [7 l- r8 `+ Y) F2 w3 \; A2 ~' A1 v/ A2 p/ p. x- P9 Y D
# Nginx doesn't support nested If statements. This is where things get slightly nasty.
+ ]0 ]' N L4 }- u0 t # Determine the HTTP request method used' ]' T5 N/ p$ D
if ($request_method = 'OPTIONS') {$ }- M9 K( K0 Y( |2 M
set $cors "${cors}options";, l0 ^5 j w8 Q, n2 O3 a
}
+ L& \$ S0 ?3 U- } if ($request_method = 'GET') {" S3 \$ w! B! _; f$ A
set $cors "${cors}get";
* x2 z. E2 ^6 t& ?+ E6 S5 U6 r9 E2 R }
" b: k( i, Q0 a- H1 [( W3 |/ Y6 j if ($request_method = 'POST') {
( r0 d2 [" ^# ~+ b. a w set $cors "${cors}post";
, I' a6 D/ U$ S3 v [2 D }, D# s1 l# O" p* f4 G: I; j
: o% w: C( |4 k! p- D' M
if ($cors = "true") {
9 ~2 z. r( g' q* E) @ # Catch all incase there's a request method we're not dealing with properly0 h$ z# r) ]- \
add_header 'Access-Control-Allow-Origin' "$http_origin";
/ h, h- r8 C0 y5 v4 ` }
+ e) C8 ^* H0 z* }) Z9 s# n" g2 B
if ($cors = "trueget") {6 _3 X8 F( K4 g3 x2 q
add_header 'Access-Control-Allow-Origin' "$http_origin";# z0 `9 }6 Z$ Y5 l- c W0 Q
add_header 'Access-Control-Allow-Credentials' 'true';/ b6 b5 l0 F0 ~) d* m6 ^2 y
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';+ T4 J; l( y% Z5 f. q! A
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';7 O ?: C- c4 l- H. P# x
}$ X0 g9 x) ^* h3 S' B6 a" x l
1 l3 W. V! h- H7 E0 G. b$ a3 G if ($cors = "trueoptions") {
& H; c4 p" Q( W3 h6 G add_header 'Access-Control-Allow-Origin' "$http_origin";7 @$ k0 I) k3 M0 u# d: g" G/ l
( h+ ^6 ]7 ~! x. q
#* q6 d# B3 |6 Q
# Om nom nom cookies
% A, _5 H0 B! }6 i! W+ y2 [ #, I0 x, M9 q2 i* _
add_header 'Access-Control-Allow-Credentials' 'true';
' Z k- K% u. S5 P4 t3 q0 t8 e; H add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';( H' C: H. |5 l1 O- T; l. T
}2 Y% K0 v% k8 |9 U
#2 d$ q0 E- i8 g. ], {7 Z4 J
# Custom headers and headers various browsers *should* be OK with but aren't
3 W6 s% e, I: M! L& A; { #7 p' a8 J* z" D+ q3 H2 P
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
. d- U5 O& |) s2 J2 @# d2 u2 B7 x5 n: P- Q! N: o
#% {# m9 f9 N6 w/ n) J H
# Tell client that this pre-flight info is valid for 20 days! ]0 {4 n r, B k1 ]$ O6 k
#' C! [; K1 d$ I
add_header 'Access-Control-Max-Age' 1728000;) f( v- `: j+ ]. y0 N( }( C1 O
add_header 'Content-Type' 'text/plain charset=UTF-8';# S; [8 T6 h9 C- U0 E% m0 @% N
add_header 'Content-Length' 0;
' J6 P, d6 x- p7 r, k; i return 204;, \$ D+ N4 B5 _
}/ U7 N; @) w5 s& l" w# p6 g- z
1 ~) j3 |0 {6 N; F. ]6 G
if ($cors = "truepost") {
& ^" b% C; `- ` add_header 'Access-Control-Allow-Origin' "$http_origin";+ K+ O( c" ^) V0 \, z' A& ?
add_header 'Access-Control-Allow-Credentials' 'true';
8 ^" ?+ ]& l2 E! \" ] add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';' g- [8 G: O; [6 w$ G4 l/ x
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
, u6 Y( \5 y! w2 @# b! B }
1 c1 n) h5 p% R; A$ F2 {
2 M* ]) }5 ~7 ~; X, q: b; \8 v}
4 P' y9 P6 Y" Q/ E0 y4 L' S
9 Z0 {* ]8 [& s# X' z- x* e2 J |
|