webman接口 get正常,post会出现跨域问题

lychuan

问题描述

webman接口 get正常,post会出现跨域问题,已经按照官网手册里的跨域中间件正确配置了。

use app\middleware\AccessControl;

return [
    '' => [
        AccessControl::class,
    ],
];

我的控制器是

app/controller/AuthController

route是

Route::post('/auth/login', [AuthController::class, 'login']);

页面报错信息:

Access to XMLHttpRequest at 'http://192.168.1.3:8787/api/auth/login' from origin 'http://localhost:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

前端vite配置:

server: {
        proxy: {
            "/api": {
                target: "http://192.168.1.3:8787",
                changeOrigin: true
            }
        }
    }

请求错误码

login post方法

General
    Request URL: http://192.168.1.3:8787/api/auth/login
    Referrer Policy: strict-origin-when-cross-origin
Request Headers
    Provisional headers are shown
    Learn more
    Accept: application/json, text/plain, */*
    Content-Type: application/json
    Referer: http://localhost:5173/
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36

login options

General
    Request URL: http://192.168.1.3:8787/api/auth/login
    Request Method: OPTIONS
    Status Code: 200 OK
    Remote Address: 192.168.1.3:8787
    Referrer Policy: strict-origin-when-cross-origin
Request Headers
    Connection: keep-alive
    Content-Length: 34
    Content-Type: application/json
    Server: workerman

为此你搜索到了哪些方案及不适用的原因

workerman通过搜索跨域相关问题,有遇到和我一样的情况,也没有解决方案。百度也搜索了vite跨域相关配置,确定已经按照文档正确配置了跨域。

1040 4 0
4个回答

lychuan

大佬们,救命,这什么原因呢?

  • 暂无评论
six

看下服务端是否有错误日志,可能500了。
浏览器里network里看http状态码是否是200、返回的http头是否带上了跨域header。

  • lychuan 2022-11-06

    大佬,network里post请求没有返回任何状态码,options请求返回200状态码,我把请求的状态码重新编辑放在上面问题里了,不知道是什么原因

  • lychuan 2022-11-06

    服务端没有错误

  • lychuan 2022-11-06

    解决了,我的错。。。。找了老半天,没好好看文档
    提示
    跨域可能会产生OPTIONS请求,我们不想OPTIONS请求进入到控制器,所以我们为OPTIONS请求直接返回了一个空的响应(response(''))实现请求拦截。
    如果你的接口需要设置路由,请使用Route::any(..) 或者 Route::add(['POST', 'OPTIONS'], ..)设置。

  • lychuan 2022-11-07

    大佬,webman两个接口,一个设置session,另一个接口拿不到session的值,是什么原因额?在webman-admin接口中确是可以的

lychuan

解决了,有遇到同样问题的同学,好好看文档吧。。。。。

提示
跨域可能会产生OPTIONS请求,我们不想OPTIONS请求进入到控制器,所以我们为OPTIONS请求直接返回了一个空的响应(response(''))实现请求拦截。
如果你的接口需要设置路由,请使用Route::any(..) 或者 Route::add(['POST', 'OPTIONS'], ..)设置。
  • 暂无评论
lychuan

又出现新问题了,当添加一个中间件的时候,又会出来跨域问题,崩了。换成any也不行了。

  • powerbowen 2022-11-07

    你用默认路由呢。不在配置里面配路由的话它会自己识别,这样试试呢

  • six 2022-11-07

    说明你新添加的中间件报错了,没执行到跨域中间件

年代过于久远,无法发表回答
🔝