HTTP OPTIONSリクエストに応答する方法は?


83

HTTPOPTIONSメソッドは、サーバーが特定のリソースでサポートする他のメソッドを決定するために使用されると思われます。それを考えると、私は2つの質問があります:

  • この応答はどのように見えますか?私は、中にCSVリストで例を見てきたPublicAllowとさえAccess-Control-Allow-Methodsヘッダ。それらはすべて必要ですか?違いは何ですか? RFC 2616は、ここではあまり役に立たないようです。

  • これを使用して、リソースが非REST-API環境でサポートするアクションを一覧表示するのは適切でしょうか?たとえば、私ConversionControllerがアクションをサポートしている場合、次のconvertような応答は意味がありますか?

リクエスト:

OPTIONS /conversion HTTP/1.1

応答:

HTTP/1.1 200 OK
...
Allow: CONVERT
...

2
Allow: CONVERT??
Pacerier 2017年

回答:


20

RFC 2616は、「許可」を定義しています(http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7)。「パブリック」はもう使用されていません。「Access-Control-Allow-Methods」はCORS仕様で定義されていますhttp://www.w3.org/TR/cors/を参照)。


ご説明ありがとうございます。CORSの場合、Allowとの両方をAccess-Control-Allow-Methods送信する必要がありますか、それとも後者のみを送信する必要がありますか?
ftDRbwLXw6 2012

私は常に「許可」を返すので、特別な場合のCORSではありません。
ジュリアンレシュケ2012

6
コンテンツはどうですか?ボディコンテンツは利用できますか?
CMCDragonkai 2014年

2
@CMCDragonkaiはい、OPTIONSコンテンツがあるかもしれません。RFC 2616から:「OPTIONSリクエストにエンティティ本体が含まれている場合(Content-LengthまたはTransfer-Encodingの存在によって示される)、メディアタイプはContent-Typeフィールドによって示されなければなりません。この仕様では定義されていませんがこのようなボディを使用する場合、HTTPの将来の拡張機能では、OPTIONSボディを使用して、サーバー上でより詳細なクエリを実行する可能性があります。このような拡張機能をサポートしないサーバーは、リクエストボディを破棄できます。」
ビショップ

CORSを使用する場合は、Allowとの両方Access-Control-Allow-Methodsが必要であると思います。前者は一般的にサポートされるメソッドを指定し、後者はクロスオリジンリクエストに許可されるメソッドを指定します。たとえば、あなたができる可能性があるGETPOSTPUTDELETE自分自身の原点にのみ許可するGETPOST、クロスオリジンのために。
ミッコランタライネン2017

8

タイトルへの応答:「HTTPOPTIONSリクエストに応答する方法は?」それに答えるために、なぜあなたがOPTIONSリクエストに応答したいのか知りたいですか?OPTIONSリクエストを送信しているのは誰/何ですか。その理由は何ですか。 多くのパブリックサーバーは、何らかの形の「エラー」または「許可されていません」(500、501、405)で応答します。したがって、クライアントがOPTIONSリクエストを合理的に送信し、有用で意味のある情報(WebDAV、CORSなど)が返されることを期待する特定の状況でない限り、「そうしないでください」と応答することをお勧めします。

「OPTIONS / ConversionHTTP / 1.1」リクエストに関する質問について:サーバーのクライアントが存在することがわかっていない限り、「/ convert」にOPTIONSリクエストを送信し、「Allow:CONVERT」の応答を期待するクライアント、」答えはノーです。そのように応答するのは意味がありません。私はほとんどの実装だと思いやるとサポートオプションおよび応答「は、許可」の標準的なHTTPメソッドで応答します。

これは、このトピックに関するすばらしい記事です。

概要:OPTIONSはキャッシュをサポートしていないため、すぐに問題が発生します。代替案:サーバー全体のメタデータ:よく知られているURIを試してください。リソース固有:応答にLinkヘッダーを使用するか、そのリソースの表現形式のリンクを使用してみてください。

最後に、求めているのがサービスの説明である場合は、WADLまたはRSDLを参照してください

編集:

dotnetguyは、以下のコメントで良い点を示しています。OPTIONSは、特定のコンテキスト(CORSなど)で間違いなく価値があります。私は確かに他のことを提案するつもりはありませんでした。


4
この記事は優れており、権威によるものですが、「HTTPbisがOPTIONSを残している理由」のセクションとコメントを参照してください。CORSを使用すると、特にAPIがJavaScriptベースのWebアプリケーションから使用される場合、RESTシステムはOPTIONSに応答できる必要があります。JSフレームワークでは、実際のHTTP呼び出しの前に「プリフライト」オプションリクエストを実行するのが一般的です。
Sudhanshu Mishra 2015

macOS Finderから(Webdavを使用して)自分の(自作の)httpサーバーに接続すると、OPTIONSリクエストが表示されました。
ジョー

7

HTTP OPTIONSリクエストとは何ですか?

のように、サーバーができるようになりますどのようなHTTPメソッドを知るために、クライアントからの要求であるGETPOSTなど、

リクエスト

特定のリソースのオプションについて尋ねると、リクエストは次のようになります。

OPTIONS /index.html HTTP/1.1

または一般的にサーバーについて尋ねるときは次のようになります。

OPTIONS * HTTP/1.1

応答

応答にはAllow、許可されたメソッドを含むヘッダーが含まれます。

Allow: OPTIONS, GET, HEAD, POST

サーバーがHTTPOPTIONSリクエストを受信するのはなぜですか?

  • 一部のRESTAPIはそれを必要とします(ただし、APIを定義している場合は、それを知っているでしょう)
  • ブラウザは、サーバーがCORSを理解しているかどうかを確認するために、「プリフライト」リクエストとしてサーバーに送信します。
  • 攻撃者はAPIに関する詳細情報を入手するために送信します

HTTP OPTIONSリクエストに応答する方法は?

  • Allowedヘッダーで応答し、APIを本文に文書化することもできます
  • 追加のCORS定義Access-Control-Request-*ヘッダーで応答できます。
  • 405 Method Not Allowedまたはで応答でき501 Not Implementedます。

HTTP OPTIONSリクエストの取得を停止するにはどうすればよいですか?

  • ブラウザからのものである場合は、APIを更新して、「危険」なこと(PUTまたは、、DELETEまたはPOSTを使用application/json)を行わないようにします。単純なリクエストのみを実行します

も参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.