我在 fedora35 上使用 perl-HTTP-Tiny-0.080 并嘗試檢查 URL 的狀態以確定回傳碼。我的腳本運行良好,直到在 sophos.com 遇到帶有 PDF 的特定 URL。腳本只是停止,使用 new() 的 get() 或 head() 呼叫永遠不會回傳。我也嘗試設定超時,但它似乎被忽略了。
use HTTP::Tiny;
use Net::FTP::Tiny qw(ftp_get);
my $url = "https://news.sophos.com/wp-content/uploads/2020/02/CloudSnooper_report.pdf";
my $response = HTTP::Tiny->new(timeout => 2)->get($url);
print "status: $response->{status} $url\n";
只是永遠無法到達印刷品。手動使用 wget 成功,而嘗試將代理設定為“HTTP/Tiny”以外的其他內容失敗。
my $response = HTTP::Tiny->new(agent => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36")->get($url);
此代碼是我用來檢查緩沖區中的一系列 URL 以確定它們是否是 404 并且應該被洗掉,或者仍然是作業鏈接的更大腳本的一部分。
我不確定我可以提供什么進一步的資訊。
uj5u.com熱心網友回復:
news.sophos.com 的 URL 重定向到www.sophos.com上的其他 URL 。后一個服務器受 Akamai CDN 保護:
$ dig www.sophos.com
...
www.sophos.com. 169 IN CNAME www.sophos.com.edgekey.net.
www.sophos.com.edgekey.net. 469 IN CNAME e6203.b.akamaiedge.net.
e6203.b.akamaiedge.net. 300 IN A 23.60.192.131
如果請求不是瀏覽器發送的典型請求,Akamai 的 bot 保護可能會表現出一些奇怪的行為。這可能會因狀態碼 403 而失敗,但也可能會像您所經歷的那樣掛起,即緩送客戶端。另請參閱請求 SSL 連接超時或特定網站 SSL 證書的奇怪 CURL 問題。另請參閱為什么 Akamai 邊緣服務有時只是不發送任何回應,使連接超時,這順便描述了您在www.sophos.com遇到的類似問題。
在這種特定情況下,只需向Accept請求添加標頭對我有用:
my $response = HTTP::Tiny->new(default_headers => { Accept => '*/*' })->get($url);
請注意,當 Akamai 調整其機器人檢測時,此解決方法可能不再適用。
我也嘗試設定超時,但它似乎被忽略了。
這是一個已知問題,在使用 TLS 1.3 時尤其明顯 - 就像這里的情況一樣。請參閱有時,超時可能無法觸發 #146。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425559.html
下一篇:Perl按值的值對哈希進行排序
