我挣扎了好几天,使我的PHP应用程序在微软Azure的PUT和DELETE请求。我找到的一些答案建议从IIS中删除WebDAV模块。
我该怎么做呢?
我花了一整天的时间在这个问题上,尝试了我遇到的每一个解决方案,但没有一个对我有效。最终成功的方法是从打开或关闭Windows功能中关闭"WebDAV发布"功能。它位于:
互联网信息服务万维网服务通用HTTP功能WebDAV Publishing.
- 在IIS中转到您的站点
- 单击"Modules"
- 删除WebDAVModule
- 重新启动站点(可能不需要)
我在Azure应用程序服务中托管一个PHP应用程序,我能够通过手动创建一个名为web的文件来解决这个问题。配置并添加到我的web应用程序的根目录。
这是该文件的全部内容。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="PHP56_via_FastCGI" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS,XYZ" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFrameworkv4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS,XYZ" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFramework64v4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS,XYZ" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PHP56_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)PHPv5.6php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
</system.webServer>
</configuration>
你会注意到在处理程序部分它引用了PHP56_via_FastCGI。这是PHP 5.6特有的。如果您使用的是不同版本的PHP,则需要更新名称和文件路径以反映该版本。
有时候我简直不敢相信那些为。net Core工作的人也在为IIS工作,至少可以这么说。我一直在搜索并试图找出问题所在,此外,我尽我所能记录错误405 Method not allowed
,但无济于事。我不想改变web.config
文件,也不想删除这个毫无意义的WebDavModule
东西,因为我的网站是和其他网站一起托管的,所以我不想毁了其他人的一天。
现在,抛开这个情绪化的介绍,我设法通过简单的IIS Configuration
步骤使其工作。想象在"simple"这个词周围加一个讽喻的双引号。
你可以这样做:
- 打开IIS管理器
- 转到要为其启用
PUT, DELETE
动词的站点级别。 - 从
Handler Mappings
点击WebDav
,然后点击Edit
- 点击
Request Restrictions
,从那里导航到Verbs
标签 - 选择
All verbs
,最后单击OK。我发誓这个UI比人类大脑神经元连接的完整地图更令人困惑。 - 重新启动
Web Site
,因为我这样做只是为了以防万一,因为我在接下来的几个月里有足够的头痛。
我认为在以前的帖子中已经有解决你的问题的方法。
试一下,希望能有所帮助!https://stackoverflow.com/a/16275723/3203213
这个响应很好。基本上把它放在Web.config中。@shiitake就是这么做的
我已经使用这个解决方案有一段时间了,但它很烦人,因为我必须在我的Web中维护它。在其他开发人员不做的时候进行配置。所以我把它从IIS中全部删除了。
- 打开IIS并进入相关站点
- 点击"Handler Mappings"
- 查找名为"WebDAV"的处理程序
- 选择并删除
第一次尝试,我得到了Error: Cannot write configuration file due to insufficient permissions
。坦白说,我的同事帮我解决了这个问题,并发送了以下说明。(也许有人可以编辑和澄清步骤。)
- 停止站点
- 将自己添加到安全组
- 删除处理程序