You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS POST请求YII2 REST API遇OPTIONS预请求404错误解决咨询

解决跨域OPTIONS预请求404问题

1. 修复Nginx配置(优先处理)

跨域OPTIONS请求常被Nginx拦截,未转发至后端。在你的Nginx location配置块中添加以下规则,直接在Nginx层面处理OPTIONS请求并返回合规响应:

location / {
    # 处理OPTIONS预请求
    if ($request_method = OPTIONS) {
        add_header Access-Control-Allow-Origin *; # 可根据实际需求替换为指定域名
        add_header Access-Control-Allow-Methods GET, POST, OPTIONS;
        add_header Access-Control-Allow-Headers Content-Type, Authorization;
        add_header Access-Control-Max-Age 86400;
        return 204; # 无内容响应,符合预请求规范
    }

    # 原有proxy_pass配置
    proxy_pass http://你的后端地址;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

修改后重启Nginx,这能让OPTIONS请求无需到达后端,直接由Nginx返回合法响应,解决预请求失败问题。

2. 修正Yii2 REST路由配置

你之前添加的OPTIONS规则存在两个问题:

  • OPTIONS后多了空格,导致路由匹配失败
  • 未指定对应/login路径的OPTIONS规则

更新路由配置如下:

['class' => 'yii\rest\UrlRule', 
    'pluralize' => false,
    'controller' => ['v1/auth'],
    'extraPatterns' => [
        'GET index' => 'index',
        'POST login' => 'login', 
        'OPTIONS login' => 'options', // 匹配/v1/auth/login的OPTIONS请求
    ],
],

3. 确保控制器支持OPTIONS动作

如果你的AuthController继承自yii\rest\Controller或yii\rest\ActiveController,默认已包含options动作,无需额外代码。若为自定义控制器,需确保实现该动作:

namespace app\controllers\v1;

use yii\rest\Controller;

class AuthController extends Controller
{
    // 确保OPTIONS动作存在
    public function actionOptions($id = null)
    {
        return parent::actionOptions($id);
    }

    // 你的其他动作:index、login等
}

验证步骤

  1. 重启Nginx和Yii2应用
  2. 用Postman或浏览器开发者工具测试OPTIONS /v1/auth/login请求,确认返回204状态码
  3. 再测试POST请求,此时预请求通过,POST应能正常执行

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:46:01