Назад | Перейти на главную страницу

Загрузка в другой домен дает код HTTP 405

Я пытаюсь загрузить файл (который может быть довольно большим) с веб-сайта одного сервера на серверную часть другого сервера с помощью plupload. Допустим:

domain 1 = http://www.websitedomain.com/uploadform
domain 2 = http://www.backenddomain.com/uploadhandler

Пытаясь загрузить, я отправляю следующее:

OPTIONS /main/uploadnetwork.php HTTP/1.1
Host: backenddomain.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.websitedomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
Access-Control-Request-Headers: origin, content-type
Accept: */*
Referer: http://www.websitedomain.com/uploadform
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
DNT: 1

Но когда я пытаюсь начать загрузку, сервер возвращает следующее:

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
X-Powered-By-Plesk: PleskWin
Date: Mon, 01 Oct 2012 12:41:57 GMT
Content-Length: 999

Проведя небольшое исследование, я обнаружил, что браузер делает это, чтобы проверить, примет ли сервер предполагаемое сообщение. Похоже, мой сервер не хочет принимать простой вызов POST, даже несмотря на то, что я использую post все время.

Консоль Google Chrome выдает следующую ошибку:

XMLHttpRequest cannot load http://www.backenddomain.com/uploadhandler. Origin http://www.websitedomain.com is not allowed by Access-Control-Allow-Origin.

Кто-нибудь знает, как остановить проверку браузера или как я могу сказать своему серверу просто принять POST?

Я обнаружил, что IIS 7.5 требует от вас указать, каким доменам разрешено отправлять POST на серверную часть (см. документация). В основном мне нужно было добавить в файл web.config следующее:

<configuration>
 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>

На этом все проблемы были решены!

Браузер, вероятно, не разрешает межсайтовые соединения. Проверьте этот сайт на предмет обходного пути на целевом сервере: http://enable-cors.org/

Я вижу, вы используете IIS. Также кажется, что URL-адрес, к которому вы пытаетесь получить доступ для использования своей веб-службы, http://www.backenddomain.com/uploadhandler в соответствии с консолью Chrome (хотя меня немного смущает, что в заголовках запросов, которые вы публикуете, когда вы пытаетесь загрузить, есть OPTIONS /main/uploadnetwork.php HTTP / 1.1 - вероятно, потому, что вы отредактировали информацию, чтобы скрыть реальный адрес) .

Я столкнулся с той же проблемой, и ответ может быть проще, чем приведенный выше, если в вашем случае вызывается URL-адрес без явного документа "Something.php" в конце. Если вы уверены, что адрес службы - www.backenddomain.com/uploadhandler (http и все удалено из-за отсутствия «достаточной репутации») и там обслуживается документ по умолчанию (я предполагаю, что это index.php), вы должны добавить косую черту в конце вашего адреса, чтобы вызвать его.

Так что звоните в сервис по этому адресу:

http://www.backenddomain.com/uploadhandler/