Post

解决 CORS 问题

解决 CORS 问题

Suggest search: Nginx CORS 跨域

0x01 CORS

CORS 是一个 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing)。

详细的可以参考: (阮一峰)跨域资源共享 CORS 详解

0x02 Nginx 解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
location / {

    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Origin 'https://crh-int.bmw-brilliance.cn' always;
    add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, 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,token';
    #add_header Access-Control-Allow-Headers '*';

    if ($request_method = 'OPTIONS') {
        return 204;
    }
}

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
cat nginx.conf

user  nginx;
worker_processes  auto;

events {
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    ## 加固
    proxy_hide_header X-Powered-By; 
    proxy_hide_header Server;

    include conf.d/*.conf;

    server {
        listen       8000;
        server_name  localhost;

        ##  加固
        ssl_protocols TLSv1.2;
        server_tokens off;


        #charset koi8-r;

        #access_log  /var/log/nginx/host.access.log  main;

        location / {
            root   /srv/www/htdocs/;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /srv/www/htdocs/;
        }

## custome begin ###

        location /charging {
                proxy_pass http://charging;
        }

        location /iwb/webServices {
                proxy_pass http://iwb-web-socket;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_set_header  Host $http_host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
        }

        # iwb-app-backend
        location /iwb/app {
                proxy_pass http://iwb-app-backend;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_set_header  Host $http_host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
                #proxy_http_version 1.1;
        }
        # cp-auc
        location /cp-auc/ {
                proxy_pass http://cp-auc;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_set_header  Host $http_host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
        }
        # monitor
        location /monitor/ {
                add_header Access-Control-Allow-Credentials true;
                add_header Access-Control-Allow-Origin 'https://静态页面的域名' always;
                add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, 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,token';
                #add_header Access-Control-Allow-Headers '*';

                if ($request_method = 'OPTIONS') {
                    return 204;
                }
                proxy_pass http://monitor;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_set_header  Host $http_host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
        }

        # EarlyWarning 
        location /EarlyWarning/ {
                add_header Access-Control-Allow-Credentials true;
                add_header Access-Control-Allow-Origin 'https://静态页面的域名' always;
                add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, 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,token';

                if ($request_method = 'OPTIONS') {
                    return 204;
                }
                proxy_pass http://EarlyWarning;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_set_header  Host $http_host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
        }
    }
    include vhosts.d/*.conf;

}

实际配置的时候,需要参照 firefox 的 Console 的错误提示进行调整。

EOF

This post is licensed under CC BY 4.0 by the author.