다음 튜토리얼 칼럼인 thinkphp 에서는 Credentials 크로스 도메인 문제 해결 아이디어가 포함된 thinkphp를 소개합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다! ㅋㅋㅋ 5.1, 대략적으로 말해 보세요 해결 방법 우선 프론트엔드는 제가 직접 작성하기 때문에 axios
구성에서 다음과 같이 설정했습니다. withCredentials: true // 크로스 도메인 시 쿠키 보내기 요청
// 创建一个axios
const service = axios.create({
baseURL: URL ,
withCredentials: true, // 跨域请求时发送cookie
timeout: 5000 // request timeout
}) 로그인 후 복사
백엔드의 구성, 구성은 header("Access-Control-Allow-Origin: *"); 로그인 후 복사
이므로
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. 로그인 후 복사
오류가 발생합니다. 이는 withCredentials
를 true
로 설정할 때를 의미합니다. , 출처는 *
일 수 없으며, 출처는 소스 주소 로 설정되어야 합니다. 즉, http://a.com이 http://b.com을 요청할 때 http:// a.com은 반드시 Origin을 http://로 설정해야 합니다. b.com은 pass할 수 있습니다
마지막으로 다음과 같은 구성을 참고하세요
$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'); 로그인 후 복사
물론, *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'); 로그인 후 복사
먼저 미들웨어를 정의하면 이렇게 될 수도 있습니다. php는 <code>router.php
에서 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);
}
} 로그인 후 복사
Route::group('', function (){
....
这里写路由
....
})->middleware(['CrossDomain']); 로그인 후 복사
을 생각했는데 새로운 문제가 발생했습니다 axios
配置中, 我设置了如下
withCredentials: true // 跨域请求时发送cookie
....
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 `抛出一个响应
}
... 로그인 후 복사
在后端的配置中,配置的是
rrreee故而抛出了这样一个错误
rrreee意思大概为 设置 withCredentials
为 true
时, origin 是不允许为 *
的, origin必须设置为来源的地址
也就是 http://a.com 请求 http://b.com 的时候, http://a.com 必须设置origin 为 http://b.com 才能通过
最后参阅配置如下
rrreee当然, 为 * 的时候也可以这样
rrreee首先 定义个中间件 php think make:middleware CrossDomain
rrreee在router.php
中
rrreee然后又有一个新问题
因为如上是走的路由文件,当请求的url
위가 라우팅 파일이기 때문에, 요청된 url
이 경로와 일치하면 교차 도메인 미들웨어로 이동합니다. 모두가 알고 있듯이 delete 및 put과 같은 메서드는 옵션 요청을 미리 시작합니다. 즉, 라우팅 파일을 일치시킬 수 없으며 크로스 도메인 미들웨어는 사용할 수 없습니다
So:
오류 예외 인수 정의 https://www.kancloud.cn/manual/thinkphp5_1/354092#_42
rrreee완료. 🎜🎜위 내용은 Thinkphp withCredentials 교차 도메인 문제 해결 아이디어 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!