Maison >cadre php >PensezPHP >Analyse des idées de résolution de problèmes inter-domaines thinkphp withCredentials

Analyse des idées de résolution de problèmes inter-domaines thinkphp withCredentials

藏色散人
藏色散人avant
2021-02-17 09:22:292154parcourir

Analyse des idées de résolution de problèmes inter-domaines thinkphp withCredentials


thinkphp withCredentials idées de résolution de problèmes inter-domaines

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[&#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

Route::group(&#39;&#39;, 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 urlLors 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.

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