angular2和Yii2应用中的预检错误

时间:2017-01-12 17:10:46

标签: javascript php .htaccess angular yii2

调用端点时出现CORS错误,请参阅以下错误:

  

XMLHttpRequest无法加载ExpandoObject。对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' http://domain.com/v1/airtime'因此不允许访问。响应的HTTP状态代码为404.

我在API根文件夹的.htaccess文件中添加了标头设置Access-Control-Allow-Origin" *" 。错误消失了,取而代之的是:

  

XMLHttpRequest无法加载domain / v1 / airtime。预检的响应具有无效的HTTP状态代码404

我寻求的其他解决方案都无法解决问题。我该怎么做才能处理预检错误?

以下是我在BaseController中用来解决CORS的代码,但似乎还不够,我仍然遇到预检错误。

{
  "/api": {
    "target": "http://domain.com/v1",
    "secure": false,
    "pathRewrite" : {"^api" : ""}
  }
}

我的proxy.conf.json文件包含以下内容:

class_name: AcceptanceTester modules: enabled: - \Helper\Acceptance - WebDriver: browser: firefox url: https://www.myexample.com/ capabilities: marionette: false

2 个答案:

答案 0 :(得分:0)

找不到404页面或资源。资源是否存在?您有请求URL和方法吗?

您是否允许预检OPTIONS方法?确保这是一种允许的CORS方法。

当您在Angular2之外请求该URL时它是否有效(例如在邮递员中使用GET / POST)?如果不是,那么先修复它。

答案 1 :(得分:0)

我假设你有同样的问题:

在某些情况下,浏览器会在实际发送卷轴之前自动执行预检请求以检查允许的方法或动词列表。您可以在浏览器的网络标签中看到这些内容。我想在Postman中你直接发送POST请求,而预先发送的OPTIONS请求应该是失败的。

Yii有一个内置动作,在ActiveController类下定义,以响应此类请求。但是在你的情况下,你正在直接扩展它的父控制器,所以你需要在你的控制器(或者父控制器)中手动定义类似的操作来响应预检请求:

将此添加到您的基本控制器

public function actionOptions() 
{
if (Yii::$app->getRequest()->getMethod() !== 'OPTIONS') {
    Yii::$app->getResponse()->setStatusCode(405);
}

$allowed_verbs = ['GET', 'POST', 'HEAD', 'OPTIONS'];
Yii::$app->getResponse()->getHeaders()->set('Allow', implode(', ', $allowed_verbs));
}

也;因为你没有使用REST的内置路由机制;在您的情况下,您还需要手动为该选项操作定义规则:(您的评论中编辑的代码版本)

'urlManager' => [ 
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [ 
    'POST <version:[\w-]+>/users/verify' => '<version>/user',

    // OPTTIONS URI ENDPOINTS
    'OPTIONS <version:[\w-]+>/users/verify' => '<version>/user',
],
];