首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >laravel处理OPTION http方法请求

laravel处理OPTION http方法请求
EN

Stack Overflow用户
提问于 2013-01-19 21:34:33
回答 3查看 21.5K关注 0票数 24

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

代码语言:javascript
复制
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

为了响应这个问题,我在之前的过滤器中添加了以下代码

代码语言:javascript
复制
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);
}

这将创建一个带有标头的响应:

代码语言:javascript
复制
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

尽管设置了标头,但浏览器仍会抛出错误

代码语言:javascript
复制
XMLHttpRequest cannot load http://localhost/61028/index.php/api/categories. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.

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

代码语言:javascript
复制
$origin=Request::header('origin');
//then within the headers
'Access-Control-Allow-Origin' =>' '.$origin[0],

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

编辑1

我目前使用的是一种非常丑陋的方法,当收到OPTIONS请求时,我会重写laravels初始化。我在index.php中做到了这一点

代码语言:javascript
复制
<?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过滤器。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-23 14:02:04

这是关于你关于上述问题的问题。您没有提到laravel和angularJS的版本。我假设您使用的是最新的angularJS和Laravel。我还假设,angular托管在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无法识别用于会话管理的域。因此,将Access-Control-Allow-Origin.的完整域名设置为http://localhost:3501我想这些会对你有帮助的。

票数 3
EN

Stack Overflow用户

发布于 2013-01-21 15:15:06

这是Laravel中的一个bug,最近在fixed中被发现。您可能希望更新到最新版本。

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

票数 -1
EN

Stack Overflow用户

发布于 2016-09-19 20:05:44

将此代码添加到index.php文件中

代码语言:javascript
复制
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');
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14414896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档