8

Ho notato Amazon S3 Redirect rule - GET data is missing ma dopo aver seguito la risposta accettata i miei parametri di query non vengono ancora conservati.Regola di reindirizzamento Amazon S3 - Conservazione di query Params

Ho un sito che utilizza React e React Router, nel senso che ho diversi URL che caricano HTML e JS identici e quindi il JS calcola quale parte dell'applicazione caricare in base all'URL.

Ad esempio:

/foo,/bar,/baz tutto dovrebbe caricare index.html, che carica bundle.js. Quindi bundle.js osserva l'URL e le rotte verso alcuni componenti React (anche in bundle.js).

Tuttavia nessun file foo, bar o baz esiste in S3, solo index.html. Quello che voglio fare è quando ottengo un 404, reindirizza a/#!/{URL} (ad es./Foo reindirizza a/#!/Foo). Funziona bene con la mia regola di reindirizzamento (sotto). Tuttavia, voglio anche portare parametri di query con me (ad es./Foo? Ping = pong reindirizza a/#!/Foo? Ping = pong) ma invece/foo? Ping = pong semplicemente reindirizza a/#!/Foo.

Qui sono le mie regole di reindirizzamento:

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

tutte le idee su qualche modo per raggiungere questo obiettivo? Idealmente senza dover cambiare qualcosa in S3/CloudFront ogni volta che aggiungo una nuova pagina?

+0

Per curiosità, '/ foo /? Ping = pong' funziona come previsto? (aggiungendo una barra finale prima del '?') –

+0

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

risposta

17

Il problema era che avevo impostato l'origine in CloudFront per non inoltrare le stringhe di query, quindi quando S3 ha ricevuto la richiesta sarebbe reindirizzata correttamente senza i parametri di query. Puoi trovare questa impostazione in CloudFront> Comportamenti> Inoltra stringhe di query.

+1

Sì !! Salvavita! –

+0

È possibile conservare parametri di query senza CloudFront ??? – doublejosh

+0

@doublejosh: Vuoi dire semplicemente colpire S3 direttamente? I parametri di query non dovrebbero essere ignorati allora. Nel mio caso, CloudFront stava rimuovendo i parametri di query, quello era il mio problema. Se non stai utilizzando CloudFront, non dovresti riscontrare lo stesso problema. –

2

Se si desidera avere l'URL chiaro, è anche possibile controllare this trick. Devi configurare la distribuzione di cloudfront e quindi modificare il comportamento 404 nella sezione "Pagine di errore" della tua distribuzione. In questo modo puoi ancora collegamenti domain.com/foo/bar :)

+0

Grazie per il suggerimento - Ho provato a configurarlo su cloudfront ma quando Guardo la scheda fonti in Chrome inspector, sta caricando la pagina index.html come file bundle.js e quindi ricevo un errore 'inatteso token '. Gli URL del mio sito web sono da "https://mydomain.io/search/0.1/index.html/article/uuid". E nel router di risposta ho un nome di base di 'search/0.1/index.html 'quindi una delle definizioni di percorso è per' article /: id'. S3 sembra ancora cercare la cartella '/ search/0.1/index.html/article'. Qualche idea su come posso risolvere questo problema? –