我花了好几天的时间才在 MS Azure 上为我的 PHP 应用程序启用 PUT 和 DELETE 请求。我发现的一些答案建议从 IIS 中删除 WebDAV 模块。
我该怎么做?
PUT 和 DELETE 请求现在应该可以工作。
我花了一整天的时间来解决这个问题,并尝试了我遇到的每一个解决方案,但没有一个对我有用。最终起作用的是从打开或关闭 Windows 功能中关闭“WebDAV 发布”功能。它位于:
Internet 信息服务\万维网服务\常见 HTTP 功能\WebDAV 发布。
我在 Azure 应用服务中托管一个 PHP 应用程序,我可以通过手动创建一个名为 web.config 的文件并将其添加到我的 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.NET\Framework\v4.0.30319\aspnet_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.NET\Framework64\v4.0.30319\aspnet_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)\PHP\v5.6\php-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
步骤使其发挥作用。 想象一下,“简单”一词周围有一个象征性讽刺的双引号。
所以你可以这样做:
PUT, DELETE
动词的站点级别。Handler Mappings
单击 WebDav
,然后单击 Edit
Request Restrictions
,然后导航至 Verbs
选项卡All verbs
,最后单击确定。 我发誓这个用户界面比人类大脑神经元连接的整个地图更令人困惑。Web Site
,因为我这样做是为了以防万一,因为在接下来的几个月里我已经够头痛了。我认为您的问题在 stackoverflow 的上一篇文章中已经有了解决方案。
尝试一下,希望有帮助! https://stackoverflow.com/a/16275723/3203213
这个反应很好。基本上把它放在Web.config中。这就是@shiitake正在做的事情。
我已经使用该解决方案有一段时间了,但它很烦人,因为我必须在我的 Web.config 中维护它,而其他开发人员则不然。所以我把它从 IIS 中全部删除了。
第一次尝试时,我得到了,
Error: Cannot write configuration file due to insufficient permissions
。完全公开,我的同事为我修复了它并发送了以下说明。 (也许有人可以编辑并澄清步骤。)
WebDAV模块 为了提取,我在手动 webconfig 文件中编写了这段代码
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
但是我希望在发布 Visual Studio 时将这一行自动添加到 webconfig 中,而不是手动添加。我会将发布文件上传到域。