更新代码及其在下的原因
我正在构建一个客户端应用程序,它具有与菲尔鲟鱼代码点火器rest应用程序对话的能力。
问题是当尝试请求OPTIONS http://site/api/login 403 (Forbidden)
和OPTIONS http://site/api/login Invalid HTTP status code 403
提示的登录方法时。
我在服务器和apache级别都启用了CORS,希望它可以更改响应消息。在application/config/config.php
中
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级别
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
$.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的登录选项调用。不幸的是这并没有改变情况。
function login_options(){
$this->response(array('response' => 'Hello World!'), 200);
}
注意:当使用POSTMAN铬分机时,所有的调用(包括对login_options的调用)都能很好地工作。
编辑:有关菲尔鲟鱼库否认,该网站的根接受飞行前的请求。使用3.0.0-pre
构建版本
编辑:与将头传递给请求有关。如果没有这个和API键禁用,它可以工作。
更新:
这个问题是由于使用虚拟主机名造成的。我不确定为什么会发生这种情况,我已经在两台不同的机器上测试了3次空白的菲尔鲟鱼休息服务器,并且能够在所有机器上复制这个问题。
不管我如何设置虚拟主机,我尝试了这两种方法。
My httpd-vhosts.conf
<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
<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
设置为通配符,所以我使用了一种不太可靠的方法
header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
发布于 2014-02-12 11:38:46
尝试更改- to _ in标题名。
发布于 2016-04-26 23:08:48
我在另一个堆栈溢出线程中找到了一个答案,它起作用了!
您需要检测方法,如果它是选项,那么通过die()退出php!
https://stackoverflow.com/questions/21564221
复制相似问题