Amazon-Web-Services

不同的http錯誤程式碼和html正文

  • September 28, 2019

我們正在使用 AWS 來託管我們的應用程序。昨天我們遇到了一個問題,不小心從 API 網關中刪除了“自定義域名”。問題已解決,服務再次開始工作。

刪除 API 網關是我們唯一能注意到的問題。但這引起了奇怪的副作用。我們正在 AWS 中針對我們的產品執行測試包並測試所有 HTTP 方法(其中一些返回 405 或 404)。現在,由於昨天的更改,我們遇到了一個問題,以前返回 405 的所有方法現在都返回 403 和一個 html 正文。所以現在返回 403 的方法是 COPY、LINK、UNLINK、PURGE、LOCK、UNLO​​CK、PROPFIND 和 VIEW。

html正文看起來像這樣

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>

<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
   <TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD>

<BODY>
   <H1>403 ERROR</H1>
   <H2>The request could not be satisfied.</H2>
   <HR noshade size="1px">
   This distribution is not configured to allow the HTTP request method that was used for this request. The
   distribution supports only cachable requests.

   <BR clear="all">
   <HR noshade size="1px">
   <PRE>
Generated by cloudfront (CloudFront)
Request ID: -uuNI4Ef393df_9X0h1oT0Elk5NztraTw-hLixxxxxxxxxxxxxxxxxxx
</PRE>
   <ADDRESS>
   </ADDRESS>
</BODY>

</HTML>

我可以在目標域名中看到提到了一個雲端實例,但是當我在尋找它時,我在 aws 控制台中找不到它。由於我沒有在列表中看到該條目,因此我們無法嘗試此處提到的修復。(https://stackoverflow.com/questions/31253694/this-distribution-is-not-configured-to-allow-the-http-request

這個問題很奇怪,因為一切都像以前一樣工作,但是這些 http 方法現在的行為不同了。

非常感謝所有幫助。

謝謝

我相信這表明您的自定義域以前被配置為區域API,但是當您重新配置自定義域時,您將它們配置為邊緣優化

CloudFront 代表 API Gateway 免費提供邊緣優化功能,並且自動附加到 API Gateway 終端節點的 CloudFront 分配在控制台中對您不可見。對於區域部署,您所看到的響應甚至是不可能的,因為這些不涉及 CloudFront。

我假設您必須更新 DNS 作為對上一個問題的補救措施的一部分。如果您仍然有更改前舊別名目標的記錄,那可能會提供一些確認。

區域 API 的目標域名看起來像d-example.execute-api.${region}.amazonaws.com,而邊緣優化 API 的目標域名為dexample.cloudfront.net. 這些是您在 DNS 中配置的值。

幸運的是,我有一個測試 API 部署到兩個不同的自定義域,一個是區域性的,另一個是邊緣優化的,我可以通過以下內容確認這個解釋。這兩個範例針對完全相同的 API、相同的階段、相同的一切,只是有兩個不同的自定義域,一個是區域性的,另一個是邊緣優化的。

區域部署

$ curl -X PROPFIND -v https://regional.example.com

< HTTP/1.1 405 Method Not Allowed
< Date: Sat, 28 Sep 2019 00:05:11 GMT
< Content-Type: null
< Content-Length: 23
< Connection: keep-alive
< x-amzn-RequestId: c03bcb0f-0a79-488a-a658-0123456789ab
< x-amz-apigw-id: Base64Stuff=

Unsupported HTTP method

邊緣優化

$ curl -X PROPFIND -v https://edge-optimized.example.com

< HTTP/1.1 403 Forbidden
< Server: CloudFront
< Date: Sat, 28 Sep 2019 00:05:19 GMT
< Content-Type: text/html
< Content-Length: 694
< Connection: keep-alive
< X-Cache: Error from cloudfront
< Via: 1.1 example.cloudfront.net (CloudFront)
< X-Amz-Cf-Pop: IAD79-C2
< X-Amz-Cf-Id: BlahBlahBase64==


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests.

<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: BlahBlahBase64==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>

我最初認為 API Gateway 有可能(但不太可能)改變了它為邊緣優化部署部署那些隱藏 CloudFront 分配的方式,因此從您的角度來看,您的新設置可能與舊設置相同,但內部行為不同。我現在認為這不太可能,因為這些測試 API 上次部署是很久以前的。


旁注:總的來說,我是 CloudFront 的忠實粉絲,但這種行為似乎不合適,根本不正確,甚至可以說是尷尬無能。它有兩個問題。

首先,它不准確。

此分發未配置為允許用於此請求的 HTTP 請求方法。該發行版僅支持可記憶體的請求。

第一部分足夠接近,但第二句話完全是胡說八道,而且毫無幫助。

第一個問題是,幾乎可以肯定,這個錯誤消息最初是為完全不同的目的而設計的。CloudFront 可以配置為允許來自三個可選集合之一的請求方法:

  • GET,HEAD
  • GET, HEAD, OPTIONS
  • GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE

PUT如果您將, POST,PATCH或發送DELETE到配置為僅支持 , 和可能的記憶體行為GETHEAD則應該顯示此錯誤OPTIONS- 換句話說,“僅可記憶體的請求” - 這裡不是這種情況。

此消息被不恰當地用於響應此集合之外的方法,這些方法不適用於 API Gateway。

第二個問題是,這當然應該是405 Method Not Allowed,而不是403 Forbidden

引用自:https://serverfault.com/questions/985856