Apache / Laravel 403 Forbidden - 不允许使用标头

时间:2015-01-06 10:32:09

标签: apache google-chrome laravel http-headers http-status-code-403

我已经24小时在这上面了,我无法在Google上找到解决我问题的任何解决方案。

我正在开发一个由Laravel 4.2 API和AngularJS 1.3前端组成的网站。

我使用laravel-cors包启用了Laravel上的CORS,我的请求一直运行到昨天早上(没有人在服务器上部署任何东西,这很奇怪)。

我在所有主流浏览器上都遇到了问题,但Firefox,当我尝试从Chrome / Safari / IE访问我的API(PUT / POST / DELETE)时,Angular生成预检OPTIONS请求,我收到此消息的403错误:

  

否'访问控制 - 允许 - 来源'标题出现在请求的上   资源。

这不是我第一次看到这个,所以我检查了laravel-cors,一切似乎都没问题,在Angular上也是如此,并且使用Firefox和POSTMAN(在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(),
    ),
);

在Angular方面

// Allow credentials
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.useXDomain = true;

我将Chrome和Firefox发送的请求与我的Apache网络服务器进行了比较,然后我用curl重新创建了它们。

第一个来自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

如果我在Access-Control-Request-Headers HTTP标头中删除接受,它运行良好,这与Firefox和其他浏览器有所不同。< / p>

这是我的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 webmaster@localhost
        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发送POST:)

2 个答案:

答案 0 :(得分:3)

太好了,我找到了解决方案。我禁用了laravel-cors并使用此配置在public/.htaccess中启用了跨域。

# with AJAX withCredentials=false (cookies NOT sent)
Header always set Access-Control-Allow-Origin "*"                   
Header always set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE" 
Header always set Access-Control-Allow-Headers "X-Accept-Charset,X-Accept,Content-Type"
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

# with AJAX withCredentials=true (cookies sent, SSL allowed...)
SetEnvIfNoCase ORIGIN (.*) ORIGIN=$1
Header always set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE" 
Header always set Access-Control-Allow-Origin "%{ORIGIN}e"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Allow-Headers "X-Accept-Charset,X-Accept,Content-Type"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]

现在一切顺利!希望这将有助于将来有同样问题的人。

答案 1 :(得分:1)

我遇到了同样的问题,连续两天。最后,当我将它们添加到.htaccess文件夹中的public_html时,这些行就成功了:

<Limit GET POST PUT DELETE>
  Allow from all
</Limit>

希望它能帮助未来的读者!