8

Zauważyłem Amazon S3 Redirect rule - GET data is missing, ale po zastosowaniu zaakceptowanej odpowiedzi moje parametry zapytania nadal nie są zachowywane.Reguła przekierowania Amazon S3 - Zachowaj parametry zapytań

Mam stronę, która używa React i React Router, co oznacza, że ​​mam kilka adresów URL, które ładują identyczny HTML i JS, a następnie JS określa, która część aplikacji ma zostać załadowana na podstawie adresu URL.

Na przykład:

/foo,/bar/baz wszystkim należy załadować plik index.html, który ładuje bundle.js. Następnie bundle.js obserwuje adres URL i trasy do jakiegoś komponentu React (również w bundle.js).

Jednak w pliku S3 nie istnieje plik foo, bar lub baz, tylko index.html. Co chcę zrobić, to gdy dostanę 404, przekierowanie do/#!/{URL} (np./Foo przekierowuje do/#!/Foo). Działa to dobrze z moją regułą przekierowania (poniżej). Jednakże, chcę również wprowadzić ze sobą parametry zapytania (np./Foo? Ping = pong przekierowuje do/#!/Foo? Ping = pong), ale zamiast tego/foo? Ping = pong po prostu przekierowuje do/#!/Foo.

Oto moje zasady przekierowania:

<RoutingRules> 
    <RoutingRule> 
     <Condition> 
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals> 
     </Condition> 
     <Redirect> 
      <Protocol>http</Protocol> 
      <HostName>www.mydomain.com</HostName> 
      <ReplaceKeyPrefixWith>#!/</ReplaceKeyPrefixWith> 
     </Redirect> 
    </RoutingRule> 
</RoutingRules> 

Wszelkie pomysły na jakiś sposób można to osiągnąć? Idealnie bez konieczności zmiany czegoś w S3/CloudFront za każdym razem, gdy dodaję nową stronę?

+0

Z ciekawości, czy '/ foo /? Ping = pong' działa zgodnie z oczekiwaniami? (dodanie końcowego ukośnika przed '?') –

+0

Przekroczony wpis ... https://stackoverflow.com/questions/20751301/how-can-i-get-query-strings-in-my-amazon-s3-static -website – doublejosh

Odpowiedz

17

Problem polegał na tym, że miałem ustawione źródło w CloudFront, aby nie przekazywać ciągów zapytań, więc gdy S3 otrzyma żądanie, przekieruje poprawnie bez parametrów zapytania. Możesz znaleźć to ustawienie w CloudFront> Zachowania> Ciągi kwerend przekazywania.

+1

Tak !! Ratownik! –

+0

Czy można zachować parametry zapytania bez CloudFront ??? – doublejosh

+0

@doublejosh: Masz na myśli po prostu trafienie S3 bezpośrednio? Kwerendy zapytań nie powinny być wtedy ignorowane. W moim przypadku CloudFront usunął parametry zapytania, to był mój problem. Jeśli nie korzystasz z CloudFront, nie powinieneś doświadczać tego samego problemu. –

2

Jeśli chcesz mieć czysty adres URL, możesz również sprawdzić this trick. Musisz skonfigurować dystrybucję w chmurze, a następnie zmienić zachowanie 404 w sekcji "Strony błędów" swojej dystrybucji. W ten sposób możesz ponownie domain.com/foo/bar linki :)

+0

Dzięki za wskazówkę - próbowałem ustawić to w chmurze, ale kiedy Patrzę na kartę źródeł w Inspektorze Chrome, ładuję stronę index.html jako mój plik bundle.js, więc otrzymuję komunikat "nieoczekiwany token <". Moje adresy URL stron internetowych pochodzą z 'https://mydomain.io/search/0.1/index.html/article/uuid. A w routerze reaguję na bazę nazw 'search/0.1/index.html ', więc jedna z definicji trasy jest dla' article /: id'. S3 nadal wydaje się szukać folderu '/ search/0.1/index.html/article'. Jakieś pomysły, jak rozwiązać ten problem? –