Nginx

NGINX - CORS 錯誤僅影響 Firefox

  • August 21, 2014

這是 Nginx 的一個問題,它只影響 firefox。我有這個配置: http: //pastebin.com/q6Yeqxv9

upstream connect {
       server 127.0.0.1:8080;
}

server {
       server_name admin.example.com www.admin.example.com;
       listen 80;
       return 301 https://admin.example.com$request_uri;
}

server {
       listen 80;
       server_name ankieta.example.com www.ankieta.example.com;
       add_header Access-Control-Allow-Origin $http_origin;
       add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, PATCH, DELETE';
       add_header 'Access-Control-Allow-Credentials' 'true';
       add_header 'Access-Control-Allow-Headers' 'Access-Control-Request-Method,Access-Control-Request-Headers,Cache,Pragma,Authorization,Accept,Accept-Encoding,Accept-Language,Host,Referer,Content-Length,Origin,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
       return 301 https://ankieta.example.com$request_uri;
}

server {
       server_name admin.example.com;
       listen 443 ssl;
       ssl_certificate /srv/ssl/14182263.pem;
       ssl_certificate_key /srv/ssl/admin_i_ankieta.example.com.key;

       ssl_protocols SSLv3 TLSv1;
       ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

       location / {
               proxy_pass http://connect;
       }
}

server {
       server_name ankieta.example.com;
       listen 443 ssl;
       ssl_certificate /srv/ssl/14182263.pem;
       ssl_certificate_key /srv/ssl/admin_i_ankieta.example.com.key;

       ssl_protocols SSLv3 TLSv1;
       ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

       root /srv/limesurvey;
       index index.php;

       add_header 'Access-Control-Allow-Origin' $http_origin;
       add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, PATCH, DELETE';
       add_header 'Access-Control-Allow-Credentials' 'true';
       add_header 'Access-Control-Allow-Headers' 'Access-Control-Request-Method,Access-Control-Request-Headers,Cache,Pragma,Authorization,Accept,Accept-Encoding,Accept-Language,Host,Referer,Content-Length,Origin,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

       client_max_body_size 4M;

       location / {
               try_files $uri $uri/ /index.php?q=$uri&$args;
       }

       location ~ /*.php$ {

               fastcgi_split_path_info ^(.+\.php)(/.+)$;
               #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
               include fastcgi_params;
               fastcgi_param SCRIPT_FILENAME /srv/limesurvey$fastcgi_script_name;
#                       fastcgi_param HTTPS $https;
               fastcgi_intercept_errors on;
               fastcgi_pass 127.0.0.1:9000;
       }

       location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
               expires max;
               log_not_found off;
       }


}

這基本上是一個 AngularJS 應用程序和一個 PHP 應用程序 (LimeSurvey),由同一個網路伺服器 (Nginx) 在兩個不同的域下提供服務。AngularJS 實際上由 ConnectJS 提供服務,它由 Nginx 代理(ConnectJS 僅在 localhost 上偵聽)。

在 Firefox 控制台中,我得到了這個:

跨域請求被阻止:同源策略不允許在 https://ankieta.example.com/admin/remotecontrol讀取遠端資源。這可以通過將資源移動到同一域或啟用 CORS 來解決。

這當然很煩人。其他瀏覽器工作正常(Chrome、IE)。

對此有何建議?

問題的發生是因為 Firefox 沒有授權 API 的 SSL 證書。通過使用 Firefox 導航到端點來信任站點的證書暫時解決了問題,同時永久更改了證書。

Firefox 和 LimeSurvey 遠端控制 API 的標頭問題可以通過代理固定標頭值或發送 blob 來解決,如https://stackoverflow.com/questions/24465304/trouble-sharing-request-headers-in-firefox-with-angularjs

引用自:https://serverfault.com/questions/601071