我在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)
答案 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',
...
})