Подтвердить что ты не робот

ОПЦИИ 405 (метод не разрешен)

Итак, я пытаюсь получить индикатор выполнения загрузки файлов на моем сайте. Если я просто загружу ресурс

$.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
});

Он работает отлично, однако, если я добавлю событие для прослушивания прогресса:

$.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
});

Я получаю:

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.

Итак, очевидно, что у моего сервера нет Access-Control-Allow-Origin и OPTIONS правильно? Но верхние 2 строки filtercontroller.php:

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

Я пробовал несколько разных решений, и никто не работал у меня.

4b9b3361

Ответ 1

Итак, в первую очередь, я не думаю, что это имеет какое-то отношение к вашей конфигурации CORS, так как это приведет к возникновению различных ошибок. Взглянув на то, что может вызвать ошибку, которую вы получаете в контексте Azure/IIS, я обнаружил следующие возможности:

  • У вас может быть явный <remove name="OPTIONSVerbHandler" /> в вашем файле web.config. (В некоторых случаях это значение по умолчанию).
  • Модуль WebDAV вмешивается, и вы должны добавить <remove name="WebDAVModule"/>

Наконец, я только что нашел этот ответ, который может предложить несколько разных решений, в которых вы не устанавливаете заголовки CORS в вашем PHP файле, а вместо этого устанавливаете их в конфигурации сервера.

Ответ 2

header() должен быть помещен до того, как в браузер будет отправлен ЛЮБОЙ вывод, как только вывод будет отправлен в браузер, header() на самом деле вызовет предупреждение PHP, которое, если вы не видите, не отображается или не отслеживается.

В качестве альтернативы вы также можете сделать это через .htaccess, который будет обрабатываться до любого из ваших PHP-скриптов. Это происходит по предположению, что вы используете apache для своего веб-сервера.

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"