web-dev-qa-db-fra.com

OPTIONS 405 (méthode non autorisée)

Je tente donc d'obtenir une barre de progression sur les téléchargements de fichiers sur mon site. Si je télécharge simplement la ressource

$.ajax({
    url: $rootScope.URL,  //Server script to process data
    type: 'POST',
    beforeSend: beforeSendHandler,
    success: completeHandler,
    error: errorHandler,
    data: formData,
    cache: false,
    contentType: false,
    processData: false
});

Cela fonctionne parfaitement, cependant si j'ajoute l'événement pour écouter les progrès:

$.ajax({
    url: $rootScope.URL,  //Server script to process data
    type: 'POST',
    xhr: function() {  // Custom XMLHttpRequest
        var myXhr = $.ajaxSettings.xhr();
        if(myXhr.upload){ // Check if upload property exists
            myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // For handling the progress of the upload
        }
        return myXhr;
    },
    beforeSend: beforeSendHandler,
    success: completeHandler,
    error: errorHandler,
    data: formData,
    cache: false,
    contentType: false,
    processData: false
});

Je reçois:

OPTIONS myserver.com/controller/filtercontroller.php? 405 (Method Not Allowed)
  jQuery.ajaxTransport.send 
  jQuery.extend.ajax    
  (anonymous function)  
  jQuery.event.dispatch 
  jQuery.event.add.elemData.handle  
XMLHttpRequest cannot load myserver.com/controller/filtercontroller.php?. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access. The response had HTTP status code 405.

Donc, évidemment, mon serveur n'a pas Access-Control-Allow-Origin et OPTIONS right? Mais les 2 premières lignes de filtercontroller.php sont:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');

J'ai essayé plusieurs solutions différentes et aucune n'a fonctionné pour moi.

14
user3194367

Tout d’abord, j’estime que cela n’a rien à voir avec votre configuration CORS, car cela produirait des erreurs différentes. En examinant les causes possibles de l'erreur que vous recevez dans le contexte Azure/IIS, j'ai découvert les possibilités suivantes:

  • Vous pourriez avoir un <remove name="OPTIONSVerbHandler" /> explicite dans votre fichier web.config. (Ceci est la valeur par défaut dans certains cas).
  • Le module WebDAV est interférant et vous devez ajouter <remove name="WebDAVModule"/>

Enfin, je viens de trouver cette réponse qui pourrait offrir différentes solutions dans lesquelles vous ne définissez pas les en-têtes CORS dans votre fichier PHP, mais plutôt dans la configuration du serveur.

5
David Mulder

La header() doit être placée avant TOUT résultat envoyé au navigateur. Une fois la sortie envoyée au navigateur, la header() émettra en réalité un avertissement PHP qui, si vous ne le voyez pas, n'est ni affiché ni suivi.

Vous pouvez également le faire via .htaccess, qui serait traité avant l’un de vos scripts PHP. Cela se passe sur la supposition que vous utilisez Apache pour votre serveur web.

Header set Access-Control-Allow-Origin "*"
# below line shouldn't be needed as by default all of those are allowed,
# if you were doing PUT, TRACE, DELETE, etc then you would need it
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
0
Augwa