【发布时间】:2014-03-01 02:45:35
【问题描述】:
更新的代码和原因进一步下降
我正在构建一个能够与Phil Sturgeons code igniter rest application 通信的客户端应用程序。
问题是在尝试请求登录方法时,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 代码,我已经注释掉了以前发送不同标头的方法。如果未指定X-API-KEY,它将返回相应的错误{"status":false,"error":"Invalid 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);
}
});
随着对 OPTION、PATCH 和 HEAD 的其余库支持的最新更新,已添加。我写了一个方法来适应总是返回 200 的登录选项调用。不幸的是,这并没有改变这种情况。
function login_options(){
$this->response(array('response' => 'Hello World!'), 200);
}
注意:当使用 POSTMAN chrome 扩展时,包括 login_options 在内的所有调用都可以正常工作。
编辑:与 Phil Sturgeons 图书馆否认有关,该站点的根目录接受飞行前请求。使用3.0.0-pre构建版本
编辑:与将标头传递给请求有关。如果不禁用此功能并禁用 API 密钥,它就可以工作。
更新:
问题是由于使用了虚拟主机名。为什么会发生这种情况我不确定,我已经在 2 台不同的机器上测试了 3 个 Phil Sturgeons rest server 的空白部分,并且能够在所有机器上复制问题。
我如何设置虚拟主机并不重要,我尝试了这两种方法。
我的 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']);
【问题讨论】:
标签: php jquery apache codeigniter cors