问题描述
在用户进行POST之后,我需要将用户重定向到另一个端点,但是另一个端点仅接受GET请求。
正如Wiki所述,HTTP代码303应该告诉客户端将请求发送到另一个位置,并将方法更改为GET:
如果服务器使用303 See Other响应和位置标头的值响应POST或其他非幂等请求,则期望客户端使用GET方法获得位置标头中提到的资源({{ 3}})。
但是在响应之后,客户端将再次使用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
解决方法
如果尝试将用户转发到的端点在同一主机/模块中,则可以使用ORDS 18.3中引入的:FORWARD_LOCATION
隐式绑定参数。
如果没有,请尝试使用ORDS响应标头,而不要使用OWA_UTIL
来设置用户应重定向到的新位置。我有一个如何here的示例。