server { listen 80; server_name localhost; # 接口转发 location /api/ { # 容许请求地址跨域 * 作为通配符 add_header 'Access-Control-Allow-Origin' '*'; # 设置请求方法跨域 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; # 设置是否容许 cookie 传输 add_header 'Access-Control-Allow-Credentials' 'true'; # 设置请求头 这里为何不设置通配符 * 由于不支持 add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token'; # 设置反向代理 proxy_pass 127.0.0.1:8081/; } }
server { listen 80; server_name localhost; # 接口转发 location /api/ { # 容许请求地址跨域 * 作为通配符 add_header 'Access-Control-Allow-Origin' '*'; # 设置请求方法跨域 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; # 设置是否容许 cookie 传输 add_header 'Access-Control-Allow-Credentials' 'true'; # 设置请求头 这里为何不设置通配符 * 由于不支持 add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token'; # 设置 options 请求处理 if ( $request_method = 'OPTIONS' ) { return 200; } # 设置反向代理 proxy_pass 127.0.0.1:8081/; } }
二者代码区别 主要就是下面这行代码java
if ( $request_method = 'OPTIONS' ) { return 200; }
由于 post 请求 浏览器会发送一个 options 的预检请求,主要将本次的请求头 发送给服务端,若服务端容许,再发送真正的post请求,因此 f12 看到,常常 post 会发送两次请求。由于后端 java 代码没有对 options 请求作出处理,致使 options 接口请求的时候,报 403 forbidden , 这里 nginx 对 options 的请求直接返回 200,不用到达接口层,直接容许 post 响应头,便可使得上述失效配置可以生效nginx
/
;针对反向代理里面这个/
加不加的问题;后端
访问 http://localhost/api/user/login;api
/
则 实际访问的是 127.0.0.1:8081/user/login;/
则实际访问的是 127.0.0.1:8081/api/
user/login;加了斜杠意味着全部的 /api
请求都会转发到根目录下,也就是说 /api
会被 /
替代,这个时候接口路径就变了,少了一层 /api
。而不加斜杠的时候呢?这表明着转发到127.0.0.1:8081的域名下, /api
的路径不会丢失跨域