我有一个基于laravel构建的应用程序,并且在本地均可正常运行,但在服务器中无法正常运行。
该应用托管在nginx上,PUT,POST,DELETE请求能够将Authorization标头发送到API(除了GET请求之外)。
这很奇怪,因为我知道在apache上您需要允许Authorization标头,而在nginx上则不需要。
我在呼叫路由Route::get('reports/{amount}','ReportsController@show');
时也进行了调试
授权标头未到达API,但在请求标头中存在。
当我将路由方法更改为POST时:
Route::post('reports/{amount}','ReportsController@show');
授权标头到达API。
这是服务器的nginx配置:
server {
listen 80;
listen [::]:80;
client_max_body_size 10M;
#add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Frame-Options 'allow-from https://www.someweb.com';
add_header X-Frame-Options 'allow-from https://www.someweb.com';
add_header X-Content-Type-Options nosniff;
add_header 'Referrer-Policy' 'strict-origin';
add_header X-XSS-Protection "1; mode=block";
root /var/www/html;
index index.html index.htm index.nginx-debian.html, index.php;
error_page 404 /404.html;
include snippets/fastcgi-php.conf;
location /security {
alias /var/www/html/security/public;
try_files $uri $uri/ @security;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
location @security {
rewrite /security/(.*)$ /security/index.php?/$1 last;
}
}
我对nginx不太熟悉,但是没有看到对标头或GET请求的任何排除。有人遇到过这个问题吗?
无论如何,有没有找出问题所在?由于我的浏览器具有标头,而API无法获取标头,因此我认为这是服务器的错误,但我不知道如何解决。
答案 0 :(得分:2)
几乎可以肯定,您必须将其添加到可以在您的nginx配置中接收的允许标头的列表中。
add_header Access-Control-Allow-Headers "Authorization";
我和您几乎在同一条船上,所以我可能会遇到相同的问题,但是就我所知,在我的开发人员中,allowHeaders设置为通配符。
您可能还必须列出add_header Access-Control-Allow-Methods "GET POST DELETE OPTIONS";
或使用*?
答案 1 :(得分:0)
怎么样?
if ($http_origin ~* "(|^https?://www\.domain1\.com$|^https?://www\.domain2\.com$|^https?://www\.domain13\.com$)") {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers "Authorization";
add_header Access-Control-Allow-Methods "GET POST DELETE OPTIONS";
}