首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >禁止跨域飞行前选择

禁止跨域飞行前选择
EN

Stack Overflow用户
提问于 2014-02-04 13:48:48
回答 2查看 4.1K关注 0票数 4

更新代码及其在下的原因

我正在构建一个客户端应用程序,它具有与菲尔鲟鱼代码点火器rest应用程序对话的能力。

问题是当尝试请求OPTIONS http://site/api/login 403 (Forbidden)OPTIONS http://site/api/login Invalid HTTP status code 403提示的登录方法时。

我在服务器和apache级别都启用了CORS,希望它可以更改响应消息。在application/config/config.php

代码语言:javascript
运行
AI代码解释
复制
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS');
header('Access-Control-Allow-Headers: X-API-KEY, X-AUTH-TOKEN');
// header('Access-Control-Allow-Methods: OPTIONS, true, 200'); <- tried this also

httpd.conf中的Apache级别

代码语言:javascript
运行
AI代码解释
复制
Header always set Access-Control-Allow-Origin "*"                   
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE"

在jQuery代码中,我已经注释掉了以前发送不同头的方法。如果没有指定{"status":false,"error":"Invalid API Key."},它将返回适当的错误X-API-KEY

代码语言:javascript
运行
AI代码解释
复制
$.ajax({
    type: "POST",
    url: "http://site/api/login",
    data: {data : encrypted_login},
    headers: {"X-API-KEY": "_API_KEY_"},
    // headers: {"X-API-KEY": "_API_KEY_", "Content-Type":  "application/x-www-form-urlencoded"},
    // beforeSend: function( xhr ) {
        // xhr.overrideMimeType( "application/x-www-form-urlencoded;" );
        // xhr.setRequestHeader('X-API-KEY', '_API_KEY_');
        // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
        // Tried different Content-Types to try avoid the pre-flight call
    // },
    // crossDomain: true,
    // dataType: 'json',
    success: function(data) {
       console.log('success' + data); // show response from the php script.
    },
    error: function(XMLHttpRequest, textStatus, errorThrown){
        alert(errorThrown); // throws empty
    },
    fail: function(data) {
        console.log('fail login : ',data);
    }
});

随着rest库对选项的支持的最新更新,补丁和HEAD已经被添加。我编写了一个方法,可以容纳总是返回200的登录选项调用。不幸的是这并没有改变情况。

代码语言:javascript
运行
AI代码解释
复制
function login_options(){
    $this->response(array('response' => 'Hello World!'), 200);
}

注意:当使用POSTMAN铬分机时,所有的调用(包括对login_options的调用)都能很好地工作。

编辑:有关菲尔鲟鱼库否认,该网站的根接受飞行前的请求。使用3.0.0-pre构建版本

编辑:与将头传递给请求有关。如果没有这个和API键禁用,它可以工作。

更新:

这个问题是由于使用虚拟主机名造成的。我不确定为什么会发生这种情况,我已经在两台不同的机器上测试了3次空白的菲尔鲟鱼休息服务器,并且能够在所有机器上复制这个问题。

不管我如何设置虚拟主机,我尝试了这两种方法。

My httpd-vhosts.conf

代码语言:javascript
运行
AI代码解释
复制
<VirtualHost *>
DocumentRoot "/Users/admin/Sites/rest_library"
ServerName rest_library
ErrorLog "/private/var/log/apache2/rest_library-error_log"
CustomLog "/private/var/log/apache2/rest_library-access_log" common
<Directory "/Users/admin/Sites">
    AllowOverride All
    Options Indexes FollowSymLinks MultiViews
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

工作伙伴httpd-vhosts.conf

代码语言:javascript
运行
AI代码解释
复制
<VirtualHost *:80>
  ServerName restserver
  DocumentRoot "/Users/admin/Sites/codeigniter-restserver"
  DirectoryIndex index.php
  <Directory "/Users/admin/Sites/codeigniter-restserver">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

为了解决这个问题,我必须将所有内容都引用为http://localhost/rest_library/api/。这也发生在CNAMES的服务器上,还没有测试顶级站点。使用完全相同的代码,我能够让非虚拟主机工作,而具有虚拟主机的主机正在失败。

另外,由于在设置Access-Control-Allow-Headers时不能将Access-Control-Allow-Credentials设置为通配符,所以我使用了一种不太可靠的方法

代码语言:javascript
运行
AI代码解释
复制
header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
EN

回答 2

Stack Overflow用户

发布于 2014-02-12 11:38:46

尝试更改- to _ in标题名。

Controller.php#L681

票数 0
EN

Stack Overflow用户

发布于 2016-04-26 23:08:48

我在另一个堆栈溢出线程中找到了一个答案,它起作用了!

您需要检测方法,如果它是选项,那么通过die()退出php!

信贷:https://stackoverflow.com/a/19310265/3679394

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21564221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档