php - 禁止跨域飞行前选项

标签 php jquery apache codeigniter cors

更新的代码和进一步的原因


我正在构建一个能够与 Phil Sturgeons code igniter rest application 对话的客户端应用程序.

问题是在尝试请求登录方法时,OPTIONS http://site/api/login 403 (Forbidden)OPTIONS http://site/api 提示我/login 无效的 HTTP 状态代码 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 代码,我已经注释掉了以前发送不同 header 的方法。如果未指定 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 的支持的 rest 库的最新更新已添加。我写了一个方法来适应总是返回 200 的登录选项调用。不幸的是,这并没有改变这种情况。

function login_options(){
    $this->response(array('response' => 'Hello World!'), 200);
}

注意:当使用 POSTMAN chrome 扩展时,所有调用(包括对 login_options 的调用)都可以正常工作。

编辑:与 Phil Sturgeons 图书馆否认它有关,网站的根接受飞行前请求。使用 3.0.0-pre 构建版本

编辑:与将 header 传递给请求有关。没有这个和 API key 禁用它工作。




更新:

问题是由于使用了虚拟主机名。我不确定为什么会这样,我已经用 Phil Sturgeons rest server 的 3 个空白部分进行了测试在 2 台不同的机器上,并且能够在所有机器上重现该问题。

无论我如何设置虚拟主机,我都尝试了这两种方法。

我的 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-Credentials 时不能将 Access-Control-Allow-Headers 设置为通配符,所以我使用了不太可靠的方法到处走走

header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);

最佳答案

关于php - 禁止跨域飞行前选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21564221/

相关文章:

PHP 高级安全 session 类

php - 从 PHP 将 MySQL 结果输出为 <table> 格式的正确方法是什么?

javascript - jquery 有没有更好的方法来做到这一点?

jquery - 隐藏 div 上的 Google Map API V3(jquery-ui 选项卡)

apache - 集成tomcat apache脚本别名错误404

ruby-on-rails - Apache 和 passenger 设置虚拟主机重启失败

php - WP_Query 当元值保存为序列化数组时

php - 在管理区域中禁用通过支付网关的 WordPress Woocommerce 退款

javascript - Yii - 在表单提交之前检索下拉值。

apache - mod_expires 还是 mod_headers?