Maison  >  Article  >  cadre php  >  Partagez thinkphp avec des idées de résolution de problèmes inter-domaines avec Credentials

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

藏色散人
藏色散人avant
2021-03-11 11:32:342035parcourir

La colonne tutorielle suivante de thinkphp vous 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 configuration axios, 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
})

dans la configuration back-end, la configuration est

header("Access-Control-Allow-Origin: *");

, 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, ce qui signifie que lors de la configuration de withCredentials à 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');

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');

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

<?php
namespace app\http\middleware;

use think\Response;


class CrossDomain
{
    public function handle($request, \Closure $next)
    {
        $origin = $_SERVER[&#39;HTTP_ORIGIN&#39;] ?? &#39;*&#39;;
        header("Access-Control-Allow-Origin: $origin");
        header(&#39;Access-Control-Allow-Credentials: true&#39;);
        header(&#39;Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With&#39;);
        header(&#39;Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE&#39;);
        header(&#39;Access-Control-Max-Age: 1728000&#39;);

        return $next($request);
    }
}

dans router.php dans

Route::group(&#39;&#39;, function (){
    ....
    这里写路由
    ....
})->middleware(['CrossDomain']);

Puis il y a un nouveau problème

Parce que le ci-dessus est le fichier de routage, lorsque le url demandé 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 `抛出一个响应
}
...

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer