发布到默认页面时,IIS:405(不允许使用方法)

时间:2010-06-25 17:27:23

标签: iis post http-status-code-405

我希望POST将数据格式化为网络服务器的默认页面,例如:

POST http://errorreporting.example.com/ HTTP/1.1

我希望服务器负责302将客户端重定向到POST应该去的地方。服务器上的default.asp文件执行此任务(which is the technique Microsoft recommends),执行Redirect

的default.asp:

<%
   Response.Redirect "SubmitError.ashx"
%>

当我只是浏览服务器时:

GET http://errorreporting.example.com/ HTTP/1.1

我从服务器得到预期的响应:

HTTP/1.1 302 Object moved
Server: Microsoft-IIS/5.0
Location: SubmitError.ashx
...

但当我POST到服务器时:

POST http://errorreporting.example.com/ HTTP/1.1

服务器对我非常脾气暴躁:

HTTP/1.1 405 Method not allowed
Connection: close
Allow: OPTIONS, TRACE, GET, HEAD
...

我希望服务器能够将客户端重定向到相应的提交URL,而不是使用对客户端进行硬编码网址。当然,这是因为URL可以(即已经改变):

  • http://errorreporting.example.com/SubmitError.asp
  • http://errorreporting.example.com/SubmitError.aspx
  • http://errorreporting.example.com/SubmitError.ashx
  • http://errorreporting.example.com/ErrorReporting/Submit.ashx
  • http://errorreporting.example.com/submiterror.php
  • http://errorreporting.example.com/submit/submiterror.ashx

注意:如果我更改URL以包含文档位置:

/* SErrorReportingUrl = 'http://www.example.com:8088/ErrorReporting/SubmitError.ashx';
   SErrorReportingUrl = 'http://www.example.com/ErrorReporting/SubmitError.ashx';
   SErrorReportingUrl = 'http://errorreporting.example.com:8088/ErrorReporting/SubmitError.ashx';
   SErrorReportingUrl = 'http://errorreporting.example.com/SubmitError.ashx';
   SErrorReportingUrl = 'http://errorreporting.example.com';
   SErrorReportingUrl = 'http://errorreporting.example.com/SubmitError.ashx'; 
*/
   SErrorReportingUrl = 'http://errorreporting.example.com/submit/SubmitError.ashx';

工作正常:

HTTP/1.1 200 OK

2 个答案:

答案 0 :(得分:3)

原来让IIS支持POST并没有真正帮助。

我正在使用XMLHttpRequest来执行POST。几乎所有XMLHttpRequest的实现(例如 Chrome,Internet Explorer,MSXML)都有一个错误,它在执行GET而不是POST之后执行在重定向之后。

W3C's XMLHttpReqest specification表示应该遵循重定向并重新发出请求:

  

如果响应是HTTP重定向:

     

如果重定向不违反安全性   (例如same origin),   无限循环预防措施,以及   方案得到支持,透明   观察时遵循重定向   same-origin request event rules

     

注意:HTTP会对用户提出要求   关于保存的代理人   重定向期间的request methodrequest entity body以及   要求最终用户收到通知   某些种类的自动   重定向。

here's a site您可以在浏览器的XmlHttpRequest实施中测试错误。


最后,我将解决 IIS 错误和XMLHttpRequest错误,让我的“默认”页面执行302 redirect所有的操作,但是返回200 OK

  

HTTP/1.1 200 OK
  Connection: close
  Date: Sun, 27 Jun 2010 13:28:14 GMT
  Server: Microsoft-IIS/6.0
  的 Location: http://errorreporting.example.com/submit/SubmitError.ashx
  Content-Length: 92
  Content-Type: text/html
  Cache-control: private

<HTML><BODY>This content has moved <A href="submit/SubmitError.ashx">here.</A></BODY></HTML>

我强迫客户做两次点击 - 不妨让它正常工作。

答案 1 :(得分:0)

我正在Express / Node上运行Vue.js。后端在服务器端口3300上运行,但是我们不想公开公开该端口。

我安装了需求(Application Request WritingURL Rewrite),然后添加了入站规则以将后端请求重写为Express,但我一直收到405(不允许使用方法)。

最终我从Stefano Scerra's Blog那里收集了一些想法。

这是我最后的web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
          <match url="(.*)" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true"/>
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
        <rule name="api" stopProcessing="true">
            <match url="^api/(.*)$" />
            <action type="Rewrite" url="http://10.1.1.217:3300/{R:1}" logRewrittenUrl="true" />
        </rule>
      </rules>
    </rewrite>
        <tracing>
            <traceFailedRequests>
                <add path="*">
                    <traceAreas>
                        <add provider="WWW Server" areas="Filter" verbosity="Verbose" />
                    </traceAreas>
                    <failureDefinitions timeTaken="00:00:00" statusCodes="100-999" />
                </add>
            </traceFailedRequests>
        </tracing>
  </system.webServer>
</configuration>