【问题标题】:Cross-Domain pre-flight OPTIONS forbidden禁止跨域飞行前选项
【发布时间】: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


    【解决方案1】:

    【讨论】:

    • 不幸的是它仍然是一样的。我将其重命名为 X_API_KEY 并在预检 OPTIONS 请求中停止。感谢您的建议,我还没有真正尝试过!
    • 因此您不再收到“无效的 API 密钥”。 ?
    • 没有得到403 Invalid HTTP Status。我们已经解决了这个问题,但在将其添加为答案之前试图找到解决它的方法。 Also as of Apache 2.4 underscores in headers are silently dropped.
    • 尝试在function login_options(){ 中发送空响应正文。也尝试不同的浏览器。
    • 甚至没有到达构造。我试过 safari、firefox 和 chrome
    【解决方案2】:

    我在另一个 Stack Overflow 线程中找到了答案,它有效!

    你需要检测方法,如果是 OPTIONS 则通过 die() 退出 php!

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

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 2013-01-07
      • 2014-02-07
      • 2012-12-24
      • 2021-08-05
      • 2012-12-25
      • 2016-10-18
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多