Je n'entrerai pas dans les détails sur ce qu'est le cross-domain. Le sujet principal ici est thinkphp5.1, parlons de la solution générale
Tout d'abord, parce que le front-end est écrit par moi-même, dans la configuration axios
, j'ai défini ce qui suit
withCredentials: true // Envoyer un cookie quand requête inter-domaine
// 创建一个axios const service = axios.create({ baseURL: URL , withCredentials: true, // 跨域请求时发送cookie timeout: 5000 // request timeout })
dans Dans la configuration du backend,
header("Access-Control-Allow-Origin: *");
est configuré, donc une telle erreur
Access to XMLHttpRequest at 'http://store.ink/admin/me?sid=lbn3mpacfb3k1mbehnk9qh8kf3' from origin 'http://vue-admin-web.ink' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
est générée. La signification est que lors de la configuration de withCredentials
. à true
, l'origine ne peut pas être *
Oui, l'origine doit être définie sur l'adresse source
, c'est-à-dire lorsque http://a.com demande http://b.com , http://a.com doit définir l'origine sur http:// b.com peut passer
Enfin, référez-vous à la configuration comme suit
$origin = $_SERVER['HTTP_ORIGIN'] ?? '*'; header("Access-Control-Allow-Origin: $origin"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE'); header('Access-Control-Max-Age: 1728000');
Bien sûr, ça peut aussi être comme ça quand c'est *
header("Access-Control-Allow-Origin: *"); header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE'); header('Access-Control-Max-Age: 1728000');
Définissez d'abord un middlewarephp think make:middleware CrossDomain
<?php namespace app\http\middleware; use think\Response; class CrossDomain { public function handle($request, \Closure $next) { $origin = $_SERVER['HTTP_ORIGIN'] ?? '*'; header("Access-Control-Allow-Origin: $origin"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE'); header('Access-Control-Max-Age: 1728000'); return $next($request); } }
Dans router.php
Route::group('', function (){ .... 这里写路由 .... })->middleware(['CrossDomain']);
Ensuite il y a un nouveau problème
Parce que le fichier de routage est utilisé comme ci-dessus, lorsque la requête url
Lors de la correspondance des routes, un middleware inter-domaines sera utilisé. Comme chacun le sait, des méthodes telles que delete et put lanceront un. Les options sont demandées à l'avance, ce qui signifie que les fichiers de routage ne peuvent pas correspondre et que le middleware inter-domaines ne peut pas être utilisé
Par conséquent :
Définissez une exception d'erreur pour prendre le relais https://www.kancloud. cn/manual/thinkphp5_1/354092#_42
.... public function render(Exception $e) { # 这里来处理跨域问题 $origin = $_SERVER['HTTP_ORIGIN'] ?? '*'; header("Access-Control-Allow-Origin: $origin"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE'); header('Access-Control-Max-Age: 1728000'); $type = request()->isAjax() ? 'json' : "html"; $response = \think\response\Json::create([], $type, 200, []); return $response; # response // 在异常处理接管中,必须返回的是一个人response响应, 而不是 `throw new `抛出一个响应 } ...
Complet.