翼度科技»论坛 编程开发 PHP 查看内容

Nginx+ThinkPHP+Vue解决跨域问题的方法详解

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
解决过程主要有两个步骤。

1.nginx配置允许跨域
  1. worker_processes  1;

  2. events {
  3.     worker_connections  1024;
  4. }

  5. http {
  6.     include       mime.types;
  7.     default_type  application/octet-stream;
  8.     sendfile        on;
  9.        
  10.     server {
  11.                 listen 80;
  12.                 # 域名
  13.                 server_name localhost;
  14.                 # 服务器根目录
  15.                 root H:\php\project\UserManager\public;
  16.                 # 默认读取的文件
  17.                 index index.php index.html index.htm;

  18.                 location / {
  19.                         # 允许浏览器跨域请求
  20.                         if ($request_method = 'OPTIONS') {
  21.                 add_header Access-Control-Allow-Origin '*';
  22.                 add_header Access-Control-Allow-Headers '*';
  23.                 add_header Access-Control-Allow-Methods '*';
  24.                 add_header Access-Control-Allow-Credentials 'true';
  25.                 return 204;
  26.             }
  27.             

  28.                         if (!-e $request_filename) {
  29.                                 rewrite ^(.*)$ /index.php?s=/$1 last; break;
  30.                         }
  31.                         try_files $uri $uri/ /index.php?$query_string;
  32.                 }

  33.                 # 监听127.0.0.1:9000端口,要和php-cgi.exe配置的ip:端口一致
  34.                 location ~ \.php$ {
  35.                         fastcgi_pass 127.0.0.1:9000;
  36.                         include fastcgi_params;
  37.                         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  38.                 }
  39.         }

  40. }
复制代码
其中的“允许浏览器跨域请求”是关键点,因为浏览器在发现网页请求是跨域请求时,会再发送一个OPTIONS请求,只有这个请求成功了才会允许跨域请求,此时,要强行配置允许跨域。(这里配置的是允许全部请求跨域)

2.在ThinkPHP中允许跨域

编辑middleware.php文件
  1. <?php
  2. // 全局中间件定义文件
  3. return [
  4.     //允许跨域
  5.     //\think\middleware\AllowCrossDomain::class
  6.     \app\middleware\AllowCrossDomain::class
  7.     // 全局请求缓存
  8.     // \think\middleware\CheckRequestCache::class,
  9.     // 多语言加载
  10.     // \think\middleware\LoadLangPack::class,
  11.     // Session初始化
  12.     // \think\middleware\SessionInit::class
  13. ];
复制代码
  1. <?php
  2. declare (strict_types = 1);

  3. namespace app\middleware;

  4. use Closure;
  5. use think\Config;
  6. use think\Request;
  7. use think\Response;

  8. /**
  9. * 跨域请求支持
  10. */
  11. class AllowCrossDomain
  12. {
  13.     protected $cookieDomain;

  14.     protected $header = [
  15.         'Access-Control-Allow-Credentials' => 'true',
  16.         'Access-Control-Max-Age'           => 1800,
  17.         'Access-Control-Allow-Methods'     => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
  18.         'Access-Control-Allow-Headers'     => 'Token, Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With',
  19.     ];

  20.     public function __construct(Config $config)
  21.     {
  22.         $this->cookieDomain = $config->get('cookie.domain', '');
  23.     }

  24.     /**
  25.      * 允许跨域请求
  26.      * @access public
  27.      * @param Request $request
  28.      * @param Closure $next
  29.      * @param array   $header
  30.      * @return Response
  31.      */
  32.     public function handle($request, Closure $next, ? array $header = [])
  33.     {
  34.         $header = !empty($header) ? array_merge($this->header, $header) : $this->header;

  35.         if (!isset($header['Access-Control-Allow-Origin'])) {
  36.             $origin = $request->header('origin');

  37.             if ($origin && ('' == $this->cookieDomain || strpos($origin, $this->cookieDomain))) {
  38.                 $header['Access-Control-Allow-Origin'] = $origin;
  39.             } else {
  40.                 $header['Access-Control-Allow-Origin'] = '*';
  41.             }
  42.         }

  43.         return $next($request)->header($header);
  44.     }
  45. }
复制代码
到此这篇关于Nginx+ThinkPHP+Vue解决跨域问题的方法详解的文章就介绍到这了,更多相关Nginx ThinkPHP解决跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/program/319139swq.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具