何が問題か
PHP on Azure App Service
な環境で、PATCH、PUT、DELETEなリクエストがエラーになります。
The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used
対処法が下記のブログに書いてはあるのですが、そのままでは動かなかったので、2017年版として更新しておきます。
どうするか
web.config
のsystem.webServer
にを下記のように追加します。
v7.1
の部分は使用しているPHPのバージョンによって読み替えてください。
<!-- web.config -->
<configuration>
<system.webServer>
<!-- 中略 -->
<handlers>
<remove name="PHP71_via_FastCGI" />
<add name="PHP71_via_FastCGI" modules="FastCgiModule" verb="GET, PATCH, PUT, POST, DELETE, HEAD, OPTIONS" path="*.php" scriptProcessor="D:\Program Files\PHP\v7.1\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
</system.webServer>
</configuration>
前述のブログにて紹介されている対処法と違うところを列挙します。
-
scriptprocessor
、resourcetype
、requireaccess
だとエラーになる-
Unrecognized attribute 'scriptprocessor'
となる -
scriptProcessor
、resourceType
、requireAccess
が正解
-
- 64ビット版の場合は、
D:\Program Files\
- 32ビット版は、
D:\Program Files (x86)\
- 32ビット版は、
-
verb
に何故かPATCH
がない-
PATCH
を追加 -
TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK
は不要なので削除
-
どうなるか
これで、PATCH, PUT, DELETE
なリクエストに対して、200 OK
が返ってくるはずです。
$ curl -i -X PATCH \
http://{appName}.azurewebsites.net/{path to API} \
-H 'content-type: application/json' \
-H 'x-requested-with: XMLHttpRequest' \
-d '{
"foo": "bar"
}'
HTTP/1.1 200 OK
Cache-Control: no-cache, private
Content-Length: 13
Content-Type: application/json
Server: Microsoft-IIS/8.0
X-Powered-By: PHP/7.1.8
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-Powered-By: ASP.NET
...
{"bar":"baz"}
つうか、デフォルトでPATCH, PUT, DELETE
は許可してほしいですね。IIS
。。
ではでは。