Я решил опубликовать полное решение этой проблемы, поскольку уже предоставленные ответы (хотя и технически правильные) не работают в этом конкретном случае для меня. Хитрость заключалась в следующем:
1. Добавьте <customHeaders>
в <httpProtocol>
в web.config
Как @hcoat также предложил выше, добавление system.webServer.httpProtocol.customHeaders
было первым шагом для решения проблемы (я уже пробовал это раньше, но это не сработало). Добавьте сюда все настраиваемые заголовки и методы HTTP, которые необходимо установить для CORS.
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Olaround-Debug-Mode, Authorization, Accept" />
<add name="Access-Control-Expose-Headers" value="X-Olaround-Debug-Mode, X-Olaround-Request-Start-Timestamp, X-Olaround-Request-End-Timestamp, X-Olaround-Request-Time, X-Olaround-Request-Method, X-Olaround-Request-Result, X-Olaround-Request-Endpoint" />
</customHeaders>
</httpProtocol>
2. Переопределите обработчик по умолчанию для PHP и удалите OPTIONSVerbHandler.
Следующий шаг (решение, предоставленное @Bing Han) — удалить OPTIONSVerbHandler
по умолчанию, определенный в IIS, а также установить собственный обработчик PHP54_via_FastCGI
, который принимает ваши дополнительные методы HTTP. Обработчик по умолчанию работает только с запросами GET, POST и HEAD.
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="PHP54_via_FastCGI" />
<add name="PHP54_via_FastCGI" path="*.php" verb="GET, PUT, POST, DELETE, HEAD, OPTIONS, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK" modules="FastCgiModule" scriptProcessor="D:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
Взгляните на эту публикацию для получения более подробной информации о внутренние работы.
3. Удалите все заголовки ответов, установленные в коде вашего приложения.
Это была последняя часть головоломки, которая вызывала больше всего проблем. Поскольку IIS уже добавлял <customHeaders>
, фрагмент кода PHP, которым я поделился в вопросе выше, дублировал их. Это вызывало проблемы на уровне браузера, который плохо реагировал на несколько заголовков одного типа.
Последний web.config
, который помог решить эту проблему
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{R:1}" pattern="^(dir_path\.php|lolaround|lolaround\.php|app_assets)" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="lolaround.php/{R:1}" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="lolaround/(.*)" ignoreCase="false" />
<action type="Rewrite" url="/lolaround.php/{R:1}" />
</rule>
</rules>
</rewrite>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Olaround-Debug-Mode, Authorization, Accept" />
<add name="Access-Control-Expose-Headers" value="X-Olaround-Debug-Mode, X-Olaround-Request-Start-Timestamp, X-Olaround-Request-End-Timestamp, X-Olaround-Request-Time, X-Olaround-Request-Method, X-Olaround-Request-Result, X-Olaround-Request-Endpoint" />
</customHeaders>
</httpProtocol>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="PHP54_via_FastCGI" />
<add name="PHP54_via_FastCGI" path="*.php" verb="GET, PUT, POST, HEAD, OPTIONS, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK" modules="FastCgiModule" scriptProcessor="D:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
</system.webServer>
</configuration>
Примечание. Хотя ответы @hcoat и @Bing Han были полезны в этой задаче, я могу присудить награду только одному из них. Я решил передать его @Bing Han, потому что его ответ приблизил меня к решению (и я не смог найти способ добавить собственный обработчик PHP из собственного поиска).
Обновление: я отредактировал ответ, чтобы добавить поддержку метода HTTP DELETE, который отсутствовал в исходном ответе.
person
Uzair Sajid
schedule
30.09.2013