我一直在这个24小时,我找不到任何解决方案在谷歌我的问题。Apache/Laravel 403禁止 - 标头不允许
我正在开发一个由Laravel 4.2 API和AngularJS 1.3前端组成的网站。
我使用laravel-cors包在Laravel上启用了CORS,并且我的请求一直运行良好,直到昨天早上(并且没有人在服务器上部署任何东西,这很奇怪)。
我在所有主流浏览器上都遇到过这个问题,但是当我试图从Chrome/Safari/IE访问我的API(PUT/POST/DELETE)时,Angular会生成一个预检选项请求,并且我得到一个403错误消息:
请求的 资源上没有“Access-Control-Allow-Origin”标头。
不是我第一次看到这一点,所以我就laravel-CORS检查,一切似乎确定,对角过,并与Firefox和邮差(在Chrome),它的工作好。
这里是我的laravel-CORS配置
return array(
'defaults' => array(
'supportsCredentials' => true,
'allowedOrigins' => array('http://localhost', 'http://example.com'),
'allowedHeaders' => array('Content-Type','X-Requested-With','accept','Origin','Access-Control-Request-Method','Access-Control-Request-Headers','Authorization'),
'allowedMethods' => array('GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'),
'exposedHeaders' => array(),
'maxAge' => 0,
'hosts' => array(),
),
);
以及角度侧
// Allow credentials
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.useXDomain = true;
我相比,Chrome和Firefox发送到我的Apache Web服务器的请求,我重新将它们与卷曲。
第一个来自Chrome和“头不允许”
curl 'http://api.example.com' -X OPTIONS -H 'Pragma: no-cache' -H 'Access-Control-Request-Method: POST' -H 'Origin: http://example.com' -H 'Acc
ept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'Referer: http://example.com/' -H 'Connection: keep-alive' -H 'Access-Control-Request-Headers: accept, content-type' --compressed
如果我删除接受返回访问控制请求报头HTTP标头,它的工作好,这是与Firefox和其他浏览器的区别。
这里是我的Apache配置和Laravel的.htaccess
的.htaccess
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule^index.php [L]
</IfModule>
虚拟主机
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName api.example.com
DocumentRoot /var/www/shoptruc/api/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/shoptruc/api/public">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
有没有人有一个想法?我现在被卡住了。 我试图在Laravel App :: before()过滤器中编写代码,但过滤器未被触发。
PS:如果你需要测试,您可以在http://api.roadtotark.com/auth/login :)