不同的http錯誤程式碼和html正文
我們正在使用 AWS 來託管我們的應用程序。昨天我們遇到了一個問題,不小心從 API 網關中刪除了“自定義域名”。問題已解決,服務再次開始工作。
刪除 API 網關是我們唯一能注意到的問題。但這引起了奇怪的副作用。我們正在 AWS 中針對我們的產品執行測試包並測試所有 HTTP 方法(其中一些返回 405 或 404)。現在,由於昨天的更改,我們遇到了一個問題,以前返回 405 的所有方法現在都返回 403 和一個 html 正文。所以現在返回 403 的方法是 COPY、LINK、UNLINK、PURGE、LOCK、UNLOCK、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
到配置為僅支持 , 和可能的記憶體行為GET
,HEAD
則應該顯示此錯誤OPTIONS
- 換句話說,“僅可記憶體的請求” - 這裡不是這種情況。此消息被不恰當地用於響應此集合之外的方法,這些方法不適用於 API Gateway。
第二個問題是,這當然應該是
405 Method Not Allowed
,而不是403 Forbidden
。