HTTP 303 Oracle ORDS

Sep 10 2020

ユーザーがPOSTを行った後、ユーザーを別のエンドポイントにリダイレクトする必要がありますが、他のエンドポイントはGETリクエストのみを受け入れます。

ウィキが言うように、HTTPコード303はクライアントに別の場所にリクエストを送信し、メソッドをGETに変更するように指示する必要があります。

サーバーがPOSTまたはその他のべき等でない要求に303See Other応答とロケーションヘッダーの値で応答する場合、クライアントはGETメソッド(source)を使用してロケーションヘッダーに記載されているリソースを取得することが期待されます。

しかし、応答後、クライアントは再びPOSTを使用してリダイレクトします。エンドポイントを不眠症でテストしました。タイムラインの出力は次のとおりです。

* Preparing request to http://******:8080/ords/demo/llmob.test_post_david
* Current time is 2020-09-10T07:21:09.418Z
* Using libcurl/7.69.1 OpenSSL/1.1.1e zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libssh2/1.9.0 nghttp2/1.29.0
* Using default HTTP version
* Disable timeout
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 5 cookies
* Connection 21 seems to be dead!
* Closing connection 21
* Hostname ****** was found in DNS cache
*   Trying 192.168.254.135:8080...
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/demo/llmob.test_post_david HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78


* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 303 
< Location: http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno
< Transfer-Encoding: chunked
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Ignoring the response-body
* Received 5 B chunk
* Connection #22 to host ****** left intact
* Issue another request to this URL: 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno'
* Disables POST, goes with GET
* Found bundle for host ******: 0x1497368c8870 [serially]
* Can not multiplex, even if we wanted to!
* Re-using existing connection! (#22) with host ******
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/devapex/sbas/r/self-check-out159/odobreno HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78

* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 405 
< Allow: GET
< Content-Type: text/html
< Content-Length: 15798
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Received 7.9 KB chunk
* Received 7.5 KB chunk
* Connection #22 to host ****** left intact

最初の応答はOWA_UTIL、次のようにパッケージで生成されます。

 owa_util.status_line(
                         nstatus=> 303, bclose_header=> false
                         );
                         
   owa_util.redirect_url(
             curl         => 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno',
            bclose_header  =>TRUE
            );

ORDSバージョン18.4。

更新

同じリクエストがブラウザから発行された場合、応答コードは403(以下のエラー)であり、リダイレクトは発生しません。

このリソースがクロスオリジン共有リクエストをサポートしていないか、リクエストオリジンがこのリソースへのアクセスを許可されていないため、リクエストを処理できません。ordsが逆プロキシされている場合は、フロントエンドサーバーがホスト名を伝搬していることを確認します。mod_proxyの場合は、ProxyPreserveHostがOnに設定されていることを確認します。

回答

EJEgyed Sep 22 2020 at 20:59

ユーザーを転送しようとしているエンドポイントが同じホスト/モジュール内にある場合は:FORWARD_LOCATION、ORDS18.3で導入された暗黙的なバインドパラメーターを使用できます。

そうでない場合は、を使用OWA_UTILしてユーザーをリダイレクトする新しい場所を設定する代わりに、ORDS応答ヘッダーを使用してみてください。ここにこれを行う方法の例があります。