Dlaczego lokalizacja przekierowania witryny S3 nie jest śledzona przez CloudFront?

18

Mam stronę internetową hostowaną na Amazon S3. Jest to nowa wersja starej witryny hostowanej na WordPress.

Skonfigurowałem niektóre pliki z metadanymi Website Redirect Locationdo obsługi starej lokalizacji i przekierowania ich na nowe strony witryny.

Na przykład: miałem http://www.mysite.com/solutiondo przekierowania, http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlwięc utworzyłem pusty plik o nazwie solutionwewnątrz mojego segmentu z poprawnymi metadanymi:

Website Redirect Location= /product.html

Metadane przekierowania S3 są równoważne z 301 Moved Permanentlytymi, które są świetne dla SEO. Działa to świetnie, gdy uzyskuje się dostęp do adresu URL bezpośrednio z domeny S3.

Skonfigurowałem również dystrybucję CloudFront na podstawie segmentu witryny. A gdy próbuję uzyskać dostęp za pośrednictwem mojej dystrybucji, przekierowanie nie działa, tj .:

http://xxxx123.cloudfront.net/solution nie przekierowuje, ale zamiast tego pobiera pusty plik.

Więc moje pytanie brzmi: jak utrzymać przekierowanie poprzez dystrybucję CloudFront? Lub jakiś pomysł, jak poradzić sobie z przekierowaniem bez pogorszenia SEO?

Dzięki

Yannick Chaze
źródło

Odpowiedzi:

47

Ostatnio natknąłem się na ten problem i znalazłem obejście, które wydawało się działać.

Utworzyłem dystrybucję Cloudfront o niestandardowym pochodzeniu, która wskazuje na statyczną nazwę hosta witryny S3 zamiast nazwy hosta segmentu. W przypadku PO pożądanym źródłem byłoby.

mysite.s3-website-us-east-1.amazonaws.com

Uderzenie w dystrybucję Cloudfront po prostu przy użyciu segmentu, ponieważ jego początek nie działa, ponieważ segment faktycznie nie obsługuje przekierowań. Obsługuje tylko pliki i przechowuje metadane.

Mam nadzieję, że to pomaga.

bmatsuo
źródło
Zauważ jednak, że Cloudfront buforuje odpowiedź przekierowania zamiast podążać za nią. W związku z tym pobierasz zasoby, które przekierowujesz, aby ominąć Cloudfront.
tfischbach,
2
bmatsuo - Gdybyśmy mogli dać ci za to miliard punktów rep, zrobilibyśmy to. Dziękuję bardzo. Naprawdę uratowałeś dzień.
snajpe
To bardzo pomogło! Warto wspomnieć o każdym, kto nie zna S3: aby utworzyć statyczny segment, przejdź do niego i przejdź do karty Właściwości. Kliknij opcję Statyczny hosting witryny. To da ci poprawny URL, który pozwoli na przekazywanie :)
rick6
2

Analiza

Zgodnie z udokumentowanym zachowaniem żądania i odpowiedzi oraz obsługiwanymi kodami stanu HTTP dla niestandardowych źródeł , Amazon CloudFront nie stosuje przekierowań , niestety:

[...] Po skonfigurowaniu przekierowania, po raz pierwszy użytkownik końcowy przesyła żądanie do obiektu, CloudFront Front wysyła żądanie do źródła, a źródło odpowiada przekierowaniem (na przykład 302 przeniesione tymczasowo). CloudFront buforuje przekierowanie i zwraca je użytkownikowi końcowemu. CloudFront nie postępuje zgodnie z przekierowaniem. [moje podkreślenie]

Oczywiście używasz Amazon S3 zamiast niestandardowego źródła, a pokrewna sekcja jest wyraźnie nieobecna w Zachowaniu żądania i odpowiedzi dla Amazon S3 Origins , ale biorąc pod uwagę, że przekierowania Amazon S3 zostały dodane dość niedawno (patrz Amazon S3 - Wsparcie dla strony internetowej Przekierowania ), może nadal tam nie być.

W związku z tym zaryzykuję przypuszczenie, że nie otrzymujesz pustego pliku z kodem stanu HTTP 200 OK , raczej stan HTTP 301 Przeniesiono na stałe bez żadnego ciała - czy faktycznie sprawdziłeś to w przeglądarce, czy w końcu tylko za pomocą narzędzia wiersza poleceń, takiego jak np. cURL lub HTTPie ? Te ostatnie narzędzia zwykle wymagają wyraźnego parametru, aby śledzić przekierowania, więc może to łatwo zostać niezauważone.

Potencjalne rozwiązanie

Jeśli analiza okaże się prawidłowa, konieczne będzie skonfigurowanie przekierowania, aby jawnie celowało w CloudFront, ponownie zobacz Przekierowania :

Możesz skonfigurować serwer WWW, aby przekierowywał żądania do jednej z następujących lokalizacji:

  • Nowy adres URL obiektu na serwerze źródłowym. Gdy użytkownik końcowy podąża za przekierowaniem do nowego adresu URL, użytkownik końcowy omija CloudFront i przechodzi bezpośrednio do źródła. W związku z tym zalecamy, aby nie przekierowywać żądań na nowy adres URL obiektu w źródle.

  • Nowy adres URL CloudFront dla obiektu. Gdy użytkownik końcowy prześle żądanie zawierające nowy adres URL CloudFront, CloudFront pobiera obiekt z nowej lokalizacji w miejscu pochodzenia, buforuje go w lokalizacji brzegowej i zwraca obiekt użytkownikowi końcowemu. Kolejne żądania dotyczące obiektu będą obsługiwane przez lokalizację na brzegu. Pozwala to uniknąć opóźnień i obciążenia związanego z przeglądarkami żądającymi obiektu od źródła. Jednak każde nowe żądanie dla obiektu spowoduje naliczenie opłat za dwa żądania do CloudFront.

Steffen Opel
źródło
Kiedy CURL URL, który musi zostać przekierowany przez dystrybucję CloudFront, otrzymuję: HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 Rozumiem, że przekierowaniem zarządza S3, w tym przypadku plik jest hostowany przez CloudFront i nie obchodzi go nagłówki przekierowań ustawione dla S3 jako S3 to serwer WWW pliku, którego nie mogę zmapować przekierowania inaczej niż z metadanymi.
Yannick Chaze