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

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.