0

我一直在這個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 :)

回答

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

有我連續兩天面臨的同樣的問題。最後,這些線路的伎倆當我在public_html文件夾將它們添加到我的.htaccess

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

希望它可以幫助未來的讀者!