3

POSTWebサーバーのデフォルトページにデータを形成したいのですが、例:

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

私はサーバーが302クライアントを行くべき場所にリダイレクトする責任を負わせたいですPOSTdefault.aspサーバー上のファイルは、:を実行することにより、このタスク( Microsoftが推奨する手法)を実行し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が変更された(つまり変更された)可能性があるためです。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
4

2 に答える 2

3

IISをサポートすることは実際にPOSTは役に立ちません。

私はsXMLHttpRequestを実行するために使用していますPOST。そこにあるほぼすべての実装XMLHttpRequest(Chrome、Internet Explorer、MSXMLなど)には、リダイレクトを追跡した後、ではなく、を実行するというバグがありますGETPOST

W3CのXMLHttpReqest仕様では、リダイレクトを追跡し、要求を再発行する必要があると規定されています。

応答がHTTPリダイレクトの場合:

リダイレクトがセキュリティに違反していない場合(たとえば、同じオリジン)、無限ループの予防措置があり、スキームがサポートされている場合は、同じオリジンのリクエストイベントルールを遵守しながら、リダイレクトを透過的に実行します。

注:HTTPは、リダイレクト中のリクエストメソッドリクエストエンティティ本体の保持に関する要件をユーザーエージェントに課します。また、特定の種類の自動リダイレクトについてエンドユーザーに通知する必要があります。

そして、これがブラウザの実装のバグをテストできるサイトです。XmlHttpRequest


最後に、 IISのバグとバグを回避するにはXMLHttpRequest、「デフォルト」ページですべての処理を実行しますが、代わりに次のように302 redirect返します。200 OK

HTTP/1.1200 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>

私はとにかくクライアントに2つのヒットを強制しています-それが正しく機能するかもしれません。

于 2010-06-27T13:35:51.613 に答える
0

Express/NodeでVue.jsを実行しています。バックエンドはサーバーポート3300で実行されていますが、公開したくありませんでした。

要件(アプリケーションリクエストの書き込みURLの書き換え)をインストールしてから、バックエンドリクエストをExpressに書き換えるためのインバウンドルールを追加しましたが、405を取得し続けました(メソッドは許可されていません)。

最終的には、StefanoScerraのブログからいくつかのアイデアを拾い集めてそれを実現しました。

これが私の最終的な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>
于 2020-06-29T04:08:06.097 に答える