Maison> cadre php> PensezPHP> le corps du texte

Partagez thinkphp avec des idées de résolution de problèmes inter-domaines avec Credentials

藏色散人
Libérer: 2021-03-12 09:01:50
avant
2014 Les gens l'ont consulté

La colonne tutorielle suivante dethinkphpvous présentera thinkphp avec des idées de résolution de problèmes inter-domaines avec Credentials. J'espère qu'elle sera utile aux amis dans le besoin !

Je n'entrerai pas ici dans les détails de ce qu'est le cross-domain. L'objectif principal ici est thinkphp5.1, parlons-en. l'idée générale de la solution

Tout d'abord, parce que le front-end est écrit par moi-même, dans la configurationaxios, j'ai défini ce qui suit

withCredentials : true // Envoyer un cookie lors du croisement -demande de domaine

// 创建一个axios const service = axios.create({ baseURL: URL , withCredentials: true, // 跨域请求时发送cookie timeout: 5000 // request timeout })
Copier après la connexion

dans la configuration back-end, la configuration est

header("Access-Control-Allow-Origin: *");
Copier après la connexion

, 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.
Copier après la connexion

est générée, ce qui signifie que lors de la configuration dewithCredentialsàtrue, l'origine ne peut pas être*, l'origine doit être définie comme 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. Grâce à

, la configuration finale de référence est la suivante

$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');
Copier après la connexion

Bien sûr, cela 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');
Copier après la connexion

Définissez d'abord un middlewarephp think make:middleware CrossDomain


         
Copier après la connexion

dansrouter.phpdans

Route::group('', function (){ .... 这里写路由 .... })->middleware(['CrossDomain']);
Copier après la connexion

Puis il y a un nouveau problème

Parce que le ci-dessus est le fichier de routage, lorsque leurldemandé correspond à l'itinéraire, le middleware inter-domaines sera utilisé Quand Comme nous le savons tous, des méthodes telles que delete et put lanceront une demande d'options à l'avance, ce qui signifie que le routage. le fichier ne peut pas être mis en correspondance et le middleware inter-domaines ne peut pas être utilisé

Par conséquent :

Définir une prise de contrôle d'exception d'erreur 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 `抛出一个响应 } ...
Copier après la connexion

est terminé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!