Ошибка CORS, IIS7 и PHP-Управление доступом-Разрешение источника


Я пытаюсь разрешить другому хосту (локальному хосту, например javascript.dev) сделать xhr для этого хоста, это IIS7, и если я curl -I, это заголовки:

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/7.0
X-Powered-By: PHP/5.3.28
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: *
X-Powered-By: ASP.NET
Date: Fri, 20 Jun 2014 12:09:33 GMT

Это заголовки для curl -v -X OPTIONS:

* About to connect() to www2.xxxxxxxxxxxx.com.br port 80 (#0)
*   Trying 200.98.xxx.100...
* Connected to www2.xxxxxxxxxxxx.com.br (200.98.xxx.100) port 80 (#0)
> OPTIONS /jobs/xxxxxxx/user/ HTTP/1.1
> User-Agent: curl/7.30.0
> Host: www2.xxxxxxxxxxxx.com.br
> Accept: */*
> 
< HTTP/1.1 200 OK
< Allow: OPTIONS, TRACE, GET, HEAD, POST
* Server Microsoft-IIS/7.0 is not blacklisted
< Server: Microsoft-IIS/7.0
< Public: OPTIONS, TRACE, GET, HEAD, POST
< X-Powered-By: ASP.NET
< Date: Fri, 20 Jun 2014 13:01:25 GMT
< Content-Length: 0

Я использовал php для изменения Access-Control-Allow-Origin, но когда я делаю xhr, с jquery или без, я получаю следующую ошибку:

XMLHttpRequest cannot load http://www2.xxxxxxxx.com.br/jobs/xxxxxx/user/. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://javascript.dev' is therefore not allowed access. 

Для документирования дополнительных шагов, которые я предпринял для решения:

Я добавил код в ответ выше в свой web.config и получил это ошибка:

XMLHttpRequest cannot load http://www2.madeinweb.com.br/jobs/eminhasaude/user. 
Request header field Content-Type is not allowed by Access-Control-Allow-Headers. 

Потому что Access-Control-Allow-Headers не принимают подстановочные знаки *. для решения:

<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
Author: Alexandre Reis Ribeiro, 2014-06-20

1 answers

Основываясь на комментариях, похоже, что вам не хватает заголовка Access-Control-Allow-Origin при отправке запроса ПАРАМЕТРОВ. Согласно этой статье , это должен быть простой случай добавления следующего кода на вашу страницу PHP...

<?php
header('Access-Control-Allow-Origin: *');
?>

Если это все еще не работает, вам следует проверить сопоставление обработчика IIS для PHP (см. здесь ) и убедиться, что параметр OPTIONS является допустимым глаголом. Надеюсь, это сделает свою работу!

В этой статье также указывается, что вы можете пропустить измените PHP вообще и просто добавьте следующее в свой web.config:

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
      <add name="Access-Control-Max-Age" value="1000" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

Имейте в виду, что это откроет весь сайт, а не только одну страницу...

 4
Author: Dean Ward, 2014-06-20 13:24:22