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等 }
验证步骤
- 重启Nginx和Yii2应用
- 用Postman或浏览器开发者工具测试
OPTIONS /v1/auth/login请求,确认返回204状态码 - 再测试POST请求,此时预请求通过,POST应能正常执行
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

