【问题标题】:laravel handling the OPTION http method requestlaravel 处理 OPTION http 方法请求
【发布时间】:2013-01-03 02:32:57
【问题描述】:

我正在开发一个 angularjs 应用程序,它使用 laravel 作为其后端服务器。 我无法从 laravel 访问数据,因为在每个 GET 请求之前,angular 首先发送一个 OPTION 请求,如下所示。

OPTIONS /61028/index.php/api/categories HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: GET
Origin: http://localhost:3501
Access-Control-Request-Headers: origin, x-requested-with, accept
Accept: */*
Referer: http://localhost:3501/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: UTF-8,*;q=0.5

我已尝试通过在前置过滤器中添加以下代码来响应此问题

if (Request::getMethod() == "OPTIONS") {
    $headers = array(
        'Access-Control-Allow-Origin' => '*',
        'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
        'Access-Control-Allow-Headers' => 'X-Requested-With, content-type'
    );
    return Response::make('', 200, $headers);
}

这会创建一个带有标题的响应:

Content-Encoding: gzip
X-Powered-By: PHP/5.3.5-1ubuntu7.11
Connection: Keep-Alive
Content-Length: 20
Keep-Alive: timeout=15, max=97
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE
Content-Type: text/html; charset=UTF-8
access-control-allow-origin: *
cache-control: no-cache
access-control-allow-headers: X-Requested-With, content-type

虽然设置了header,但是浏览器还是会报错

XMLHttpRequest cannot load http://localhost/61028/index.php/api/categories. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.

我还尝试将允许来源设置为请求标头中显示的来源,如下所示

$origin=Request::header('origin');
//then within the headers
'Access-Control-Allow-Origin' =>' '.$origin[0],

仍然是同样的错误 我究竟做错了什么?非常感谢任何帮助。

编辑 1

我目前正在使用一个非常丑陋的 hack,当收到 OPTIONS 请求时,我会覆盖 laravel 初始化。这是我在 index.php 中完成的

<?php
if ($_SERVER['REQUEST_METHOD']=='OPTIONS') {
    header('Access-Control-Allow-Origin : *');
    header('Access-Control-Allow-Methods : POST, GET, OPTIONS, PUT, DELETE');
    header('Access-Control-Allow-Headers : X-Requested-With, content-type');
}else{
/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @version  3.2.13
 * @author   Taylor Otwell <taylorotwell@gmail.com>
 * @link     http://laravel.com
 */

我还必须将 allow-origin 标头添加到 before 过滤器中。

我知道这并不聪明,但这是我目前唯一的解决方案

【问题讨论】:

  • 我很确定当我尝试这个时,我发现有些浏览器要求大小写正确。看起来 Laravel 正在将所有内容都小写,这在技术上是可以的,但可能仍然会失败。
  • @Evert 我注意到了这一点,并考虑使用内置的 php header() 函数。但是问题仍然存在。
  • 那很奇怪。您是否还确保为 GET、PUT、DELETE 和 POST 请求发回所有这些标头?这是必需的..

标签: php cors laravel


【解决方案1】:

这是针对您对上述问题提出的问题。你没有提到 laravel 和 angularJS 的版本。我假设您使用的是最新的 angularJS 和 Laravel。我还假设,角度托管在 http://localhost:3501 和 laravel 托管在 http://localhost 只需按照以下步骤操作。

  • 将下面的代码块放在 laravel 的 /public/.htaccess 文件中

    Header set Access-Control-Allow-Origin "http://localhost:3501"
    Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
    Header set Access-Control-Allow-Credentials "true"
    
  • 将下面的行放在 angular 的配置中

    $httpProvider.defaults.withCredentials = true;
    

切勿使用 * 作为通配符。 Larvel 无法识别用于会话管理的域。所以将 http://localhost:3501 设置为 Access-Control-Allow-Origin 的完整域名。 我想这些会对你有所帮助。

【讨论】:

    【解决方案2】:

    最近fixed 是 Laravel 中的一个错误。您可能需要更新到最新版本。

    另外,您需要为您的服务器启用 CORS 支持。

    【讨论】:

    • “您需要为您的服务器启用 CORS 支持”是什么意思?
    • “另外,你需要为你的服务器启用 CORS 支持”——这没有意义,这就是问题试图实现的目标。
    【解决方案3】:

    将此添加到您的 index.php 文件中

    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多