CorsMiddleware.php 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class CorsMiddleware
  5. {
  6. private $headers = [
  7. 'Access-Control-Allow-Methods' => '*',
  8. 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With,DNT,X-Mx-ReqToken,ETag,Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,language',
  9. 'Access-Control-Allow-Credentials' => 'true',//允许客户端发送cookie
  10. 'Access-Control-Max-Age' => 1728000 //该字段可选,用来指定本次预检请求的有效期,在此期间,不用发出另一条预检请求。
  11. ];
  12. private $allow_origin = ['*'];
  13. protected $urls = ['/admin/view/attach-download/*', '/admin/user/student-export', '/admin/tcm/patient-export', '/api/course/attach-download/*'];
  14. /**
  15. * Handle an incoming request.
  16. *
  17. * @param \Illuminate\Http\Request $request
  18. * @param \Closure $next
  19. * @return mixed
  20. */
  21. public function handle($request, Closure $next)
  22. {
  23. // $response = $next($request);
  24. //
  25. // $paths = $this->urls;
  26. //// foreach ($paths as $path) {
  27. //// if ($path !== '/') {
  28. //// $path = trim($path, '/');
  29. //// }
  30. ////
  31. //// if ($request->fullUrlIs($path) || $request->is($path)) {
  32. //// return $response;
  33. //// }
  34. //// }
  35. // $response->header('Access-Control-Allow-Origin', '*');
  36. // $response->header('Access-Control-Allow-Methods', '*');
  37. // $response->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With,DNT,X-Mx-ReqToken,ETag,Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,language');
  38. //// $response->header('Access-Control-Allow-Headers', '*');
  39. // return $response;
  40. // $this->headers = [
  41. // 'Access-Control-Allow-Methods' => '*',
  42. // 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With,DNT,X-Mx-ReqToken,ETag,Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,language',
  43. // 'Access-Control-Allow-Credentials' => 'true',//允许客户端发送cookie
  44. // 'Access-Control-Max-Age' => 1728000 //该字段可选,用来指定本次预检请求的有效期,在此期间,不用发出另一条预检请求。
  45. // ];
  46. // $this->allow_origin = ['*'];
  47. $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
  48. //如果origin不在允许列表内,直接返回403
  49. if (!in_array('*', $this->allow_origin) && !in_array($origin, $this->allow_origin) && !empty($origin))
  50. return Response('Forbidden', 403);
  51. //如果是复杂请求,先返回一个200,并allow该origin
  52. if ($request->isMethod('options'))
  53. return $this->setCorsHeaders(Response('OK', 200), $origin);
  54. //如果是简单请求或者非跨域请求,则照常设置header
  55. $response = $next($request);
  56. $methodVariable = array($response, 'header');
  57. //这个判断是因为在开启session全局中间件之后,频繁的报header方法不存在,所以加上这个判断,存在header方法时才进行header的设置
  58. if (is_callable($methodVariable, false, $callable_name)) {
  59. return $this->setCorsHeaders($response, $origin);
  60. }
  61. return $response;
  62. }
  63. /**
  64. * @param $response
  65. * @return mixed
  66. */
  67. public function setCorsHeaders($response, $origin)
  68. {
  69. foreach ($this->headers as $key => $value) {
  70. $response->header($key, $value);
  71. }
  72. if (in_array($origin, $this->allow_origin)) {
  73. $response->header('Access-Control-Allow-Origin', $origin);
  74. } elseif (in_array('*', $this->allow_origin)) {
  75. $response->header('Access-Control-Allow-Origin', '*');
  76. } else {
  77. $response->header('Access-Control-Allow-Origin', '');
  78. }
  79. return $response;
  80. }
  81. }