Laravel5中子域之间的CORS问题

时间:2017-03-26 20:27:30

标签: apache .htaccess laravel-5 cors

我在Laravel5上构建了一个API,并在开发环境中的localhost上遇到了CORS问题,所以我开发了这个中间件并在API的路由上使用,解决了这个问题:

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request)
        ->header('Access-Control-Allow-Origin', 'http://zekrishna.com')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

        return  $response;
    }
}

当我解开应用程序时,CORS问题再次开始。我使用相同的服务器来托管API和前端,其中前端位于服务器的根目录,而API位于子域。

这是public/上的.htacess:

...

<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
</IfModule>

我做错了什么?

这是错误:

  

XMLHttpRequest无法加载   http://api.zekrishna.com/api/agenda/?api_token=9BuDRcUxUbl9jW2FDnMxToijR8plDsT4xkVRg7m3AThJHJWXqsNSOGy94x1B。   重定向   'http://api.zekrishna.com/api/agenda/?api_token=9BuDRcUxUbl9jW2FDnMxToijR8plDsT4xkVRg7m3AThJHJWXqsNSOGy94x1B'   至   'http://api.zekrishna.com/api/agenda?api_token=9BuDRcUxUbl9jW2FDnMxToijR8plDsT4xkVRg7m3AThJHJWXqsNSOGy94x1B'   被CORS政策阻止:没有'Access-Control-Allow-Origin'   标头出现在请求的资源上。起源   因此,“http://zekrishna.com”不允许访问。

修改

我删除了我的.htaccess规则并更改了我的中间件:(由于响应标头上存在重复的Access-Control-Allow-Origin)

public function handle($request, Closure $next)
{
    $response = $next($request)
    ->header('Access-Control-Allow-Origin', 'http://zekrishna.com')
    ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
    ->header('Access-Control-Allow-Headers: *')
    ->header('Access-Control-Allow-Credentials: true')
    ->header('Access-Control-Allow-Credentials: true');

    return  $response;
}

我正在使用jQuery $.ajax方法来调用API

const API_TOKEN = '9BuDRcUxUbl9jW2FDnMxToijR8plDsT4xkVRg7m3AThJHJWXqsNSOGy94x1B';
const API = 'http://api.zekrishna.com/api';

...

$.ajax({
    url: API + '/agenda/',
    type: 'GET',
    crossDomain: true,
    data: {api_token: API_TOKEN}
})
.done(setConcerts)

2 个答案:

答案 0 :(得分:0)

我可以通过HTTP GET访问它,并且似乎发送了两个标头。您的htaccess正在设置一个,就像您的中间件一样。

XMLHttpRequest无法加载http://api.zekrishna.com/api/agenda?api_token=9BuDRcUxUbl9jW2FDnMxToijR8plDsT4xkVRg7m3AThJHJWXqsNSOGy94x1B。 &#39; Access-Control-Allow-Origin&#39;标头包含多个值&#39; http://zekrishna.com,*&#39;,但只允许一个。因此不允许原点访问

您的本地环境htaccess是否可能无法启动?

答案 1 :(得分:0)

我根据我的要求删除了最后一个斜线并且工作了! 服务器正在重定向,并且不允许这些请求。

在:

$.ajax({
    url: API + '/agenda/',
    ...
})

然后:

$.ajax({
    url: API + '/agenda',
    ...
})