vue + tp5 前后端分离项目中的跨域问题

本文介绍了如何在 FastAdmin 中处理前后端不同域名的跨域问题,通过修改API接口的header策略,并针对TP站点上传文件静态预览时的跨域问题,探讨了使用Nginx配置解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常这个问题是不会出现的, 我们在使用vue-cli 打包的时候, 就把打包的后的线上项目文件放在 tp的 public/(dist)的目录下面就好了, 不一定非要是dist 目录,自已打包时打定的, 以上的方式就不会出现 跨域的问题

我现在要说的是另一种方式, 前端,后端各有自已的 域名,如前端为 http://front.XXXX.com 后端的域名是 http://backend.XXXX.com
前端会在页面中使用 axios 来请求 后端的地址, 这一看, 妥妥的跨域了

我在 fastadmin 找到的 api 接口的解决跨域问题的代码, 可以参考一下, 在fastadmin 如果请求中 是以 /api 开头,就会走这段代码来解决跨域问题

 function check_cors_request()
    {
        if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN']) {
            $info = parse_url($_SERVER['HTTP_ORIGIN']);
            $domainArr = explode(',', config('fastadmin.cors_request_domain'));
            $domainArr[] = request()->host(true);
            if (in_array("*", $domainArr) || in_array($_SERVER['HTTP_ORIGIN'], $domainArr) || (isset($info['host']) && in_array($info['host'], $domainArr))) {
                header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
            } else {
                $response = Response::create('跨域检测无效', 'html', 403);
                throw new HttpResponseException($response);
            }

            header('Access-Control-Allow-Credentials: true');
            header('Access-Control-Max-Age: 86400');

            if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
                if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
                    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
                }
                if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
                    header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
                }
                $response = Response::create('', 'html');
                throw new HttpResponseException($response);
            }
        }
    }

说白了, 它就是加一请求头
header(“Access-Control-Allow-Origin: *” );
header(‘Access-Control-Allow-Credentials: true’);
header(‘Access-Control-Max-Age: 86400’);

这样就解决了跨域的问题


但是我很幸运, 我遇到了另一个问题, 文件预览 上面的方法好像是解决不了
先说一下原因
我们知道 tp 的上传文件是在 public/uploads/… 的文件夹中的
我们访问的时候 是这样的 http://www.domain.com/uploads/…docx
有什么不一样吗?
上面的 路径根本没有 /api 所以也就不会走 以上的跨域解决方案, 所以, 当我的在前端要预览 站点中上传过的文件的时候, 就又出现了跨域的问题
这种情况, 访问静态文件的跨域解决办法, 我们是例用 nginx 的解决跨域方案


server
    {
        listen 80;
        server_name cont.wool.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/coct.wool.com/public;

        include rewrite/thinkphp.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php-pathinfo.conf;

		#这里就是解决方案的重点,  路由匹配到  /uploads  就进行跨域的相关配置,注意这里的 $http_origin是一个 nginx的变量, 不懂的可以百度一下,

        location /uploads {
			add_header 'Access-Control-Allow-Origin' $http_origin;
			add_header 'Access-Control-Allow-Credentials' 'true';
			add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
			add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
			add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
			if ($request_method = 'OPTIONS') {
				add_header 'Access-Control-Max-Age' 1728000;
				add_header 'Content-Type' 'text/plain; charset=utf-8';
				add_header 'Content-Length' 0;
				return 204;
			}
	}





        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /home/wwwlogs/contract.wukool.com.log;
    }
		add_header 'Access-Control-Allow-Origin' $http_origin;
		add_header 'Access-Control-Allow-Credentials' 'true';
		add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
		add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
		add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

这里就是重点,完成以上操作, 预览文件就没有跨域的报错了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A黄俊辉A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值