8

Ich bemerkte Amazon S3 Redirect rule - GET data is missing, aber nach der Annahme der akzeptierten Antwort werden meine Abfrageparameter noch nicht erhalten.Amazon S3 Redirect-Regel - Query Params beibehalten

Ich habe eine Website, die React und React Router verwendet, was bedeutet, dass ich mehrere URLs habe, die identische HTML und JS laden und dann die JS herausfinden, welcher Teil der App basierend auf der URL geladen wird.

Zum Beispiel:

/foo,/bar,/baz sollten alle index.html laden, die bundle.js lädt. Dann beobachtet bundle.js die URL und routet zu einer React-Komponente (auch in bundle.js).

Jedoch existiert keine foo, bar oder baz Datei in S3, nur index.html. Was ich tun möchte ist, wenn ich einen 404 bekomme, umleitung zu/#!/{URL} (zB./Foo leitet zu/#!/Foo um). Dies funktioniert gut mit meiner Weiterleitungsregel (unten). Allerdings möchte ich auch Abfrageparameter mitbringen (zB./Foo? Ping = pong leitet zu/#!/Foo? Ping = pong um), stattdessen wird/foo? Ping = pong nur nach/#!/Foo umgeleitet.

Hier sind meine Umadressierungsregel:

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

Irgendwelche Ideen auf irgendeine Weise ich dies erreichen können? Idealerweise ohne etwas an S3/CloudFront ändern zu müssen, wenn ich eine neue Seite anlege?

+0

Aus Neugier, funktioniert '/ foo /? Ping = Pong' wie erwartet? (einen Schrägstrich vor dem '?' hinzufügen) –

+0

Cross-Post ... https://stackoverflow.com/questions/20751301/how-can-ig-query-strings-in-my-amazon-s3-static -Website – doublejosh

Antwort

17

Das Problem war, dass ich den Ursprung in CloudFront eingerichtet hatte, Query Strings nicht weiterzuleiten, also wenn S3 die Anforderung bekam, würde es richtig ohne die Abfrageparameter umleiten. Sie finden diese Einstellung in CloudFront> Verhalten> Abfragezeichenfolgen weiterleiten.

+1

Ja !! Lebensretter! –

+0

Ist es möglich, Abfrageparameter ohne CloudFront zu erhalten ??? – doublejosh

+0

@doublejosh: Du meinst nur S3 direkt zu treffen? Abfrageparameter sollten dann nicht ignoriert werden. In meinem Fall löschte CloudFront Abfrageparameter, das war mein Problem. Wenn Sie CloudFront nicht verwenden, sollte das Problem nicht auftreten. –

2

Wenn Sie klare URLs haben möchten, können Sie auch this trick überprüfen. Sie müssen die Cloudfront-Verteilung einrichten und dann das Verhalten von 404 im Abschnitt "Fehlerseiten" Ihrer Distribution ändern. So können Sie wieder domain.com/foo/bar Links :)

+0

Danke für den Tipp - ich habe versucht, dies in der Cloudfront einzurichten, aber wann Ich schaue mir den Quellen-Tab im Chrome-Inspektor an, lade die Seite index.html als meine bundle.js-Datei und bekomme einen 'unerwarteten Token <' -Fehler. Meine Website URLs sind der von 'https://mydomain.io/search/0.1/index.html/article/uuid. Und im react Router habe ich einen Basisnamen von 'search/0.1/index.html ', also ist eine der Routendefinitionen für' article /: id'. S3 scheint immer noch nach dem Ordner '/ search/0.1/index.html/article' zu ​​suchen. Irgendwelche Ideen, wie ich dieses Problem lösen kann? –