webman跨域相关问题

2023年9月13日14:14:05

webman版本1.5

php版本8.0

运行环境windows

测试项目:https://gitee.com/open-php/zx-webman-website

webman在跨域的时候,会有点不同因为第一个区别就是是否关闭自动路由

复制代码
//关闭自动路由
Route::disableDefaultRoute();

如果不关闭路由只要简单的在路由上挂上跨域中间件,如果开启自动路由,就在config/middleware.php添加就可以了

复制代码
return [
    '' => [
        app\middleware\CrossDomain::class,//跨域请求
    ]
];

CrossDomain中间件的代码

复制代码
<?php

namespace app\middleware;

use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;

//跨域
class  CrossDomain implements MiddlewareInterface
{
    public function process(Request $request, callable $next): Response
    {
//        p(getTime() . self::class);
        // 如果是options请求则返回一个空响应,否则继续向洋葱芯穿越,并得到一个响应
        $response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : $next($request);
        // 给响应添加跨域相关的http头
        $response->withHeaders([
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Allow-Origin' => $request->header('origin', '*'),
            'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'),
            'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'),
        ]);
        return $response;
    }
}

如果关闭自动路由挂在中间件就如下:

复制代码
Route::group('/open', function () {

    Route::get('/test', [app\controller\Web\TestController::class, 'index'])->name('测试');
    Route::post('/uploadPic', [app\controller\Web\IndexController::class, 'uploadPic']);//上传图片文件
    Route::post('/uploadFile', [app\controller\Web\IndexController::class, 'uploadFile']);//上传普通文件
})->middleware([
    app\middleware\CrossDomain::class,
    app\middleware\ApiLog::class
]);

关闭自动路由的情况下需要额外配置一点东西

复制代码
<?php
/**
 * This file is part of webman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author    walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link      http://www.workerman.net/
 * @license   http://www.opensource.org/licenses/mit-license.php MIT License
 */

use app\util\GlobalCode;
use Webman\Route;
use support\Request;

//请求不存在的url返回信息
Route::fallback(function (Request $request) {
    $response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : returnJson([GlobalCode::CODE => GlobalCode::NOT_FOUND, GlobalCode::MSG => '404 not found', GlobalCode::DATA => null]);
    $response->withHeaders([
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Allow-Origin' => "*",
        'Access-Control-Allow-Methods' => '*',
        'Access-Control-Allow-Headers' => '*',
    ]);
    return $response;
});
//关闭自动路由
Route::disableDefaultRoute();

//首页
Route::get('/', function ($rquest) {
    return view('index/view');
});

//前台,api有权限
Route::group('/open', function () {

    Route::get('/test', [app\controller\Web\TestController::class, 'index'])->name('测试');
    Route::post('/uploadPic', [app\controller\Web\IndexController::class, 'uploadPic']);//上传图片文件
    Route::post('/uploadFile', [app\controller\Web\IndexController::class, 'uploadFile']);//上传普通文件
})->middleware([
    app\middleware\CrossDomain::class,
    app\middleware\ApiLog::class
]);


if (!function_exists('returnJson')) {
    function returnJson(mixed $data = null, int $status = 200, array $headers = ['Content-Type' => 'application/json'], int $options = JSON_UNESCAPED_UNICODE): Response
    {
        return new Response($status, $headers, json_encode($data, $options));
    }
}
相关推荐
酉鬼女又兒17 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
神仙别闹18 小时前
基于 PHP + MySQL学生信息管理系统
android·mysql·php
天启HTTP20 小时前
开启全局代理后网络变慢,问题出在哪
开发语言·前端·网络·tcp/ip·php
荒-漠21 小时前
phpstorm2026版本汉化
php·phpstorm
狗凯之家源码网1 天前
PHP 原版公众号无限回调系统修复版效果实测
开源·php
神仙别闹1 天前
基于 PHP + MySQL 图书库存管理系统
android·mysql·php
2601_961845151 天前
2026四级作文预测题|英语四级写作押题+提纲PDF
java·c语言·数据库·c++·python·pdf·php
CRMEB系统商城1 天前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
修炼室2 天前
外网环境原生直连校内服务器:基于内网穿透 + SSH 密钥认证的完整实践指南
服务器·ssh·php
BingoGo2 天前
PHP 在领域驱动(DDD)设计中的核心实践
后端·php