8

Tôi nhận thấy Amazon S3 Redirect rule - GET data is missing nhưng sau khi làm theo câu trả lời được chấp nhận, thông số truy vấn của tôi vẫn không được giữ nguyên.Quy tắc chuyển hướng Amazon S3 - Bảo tồn Params truy vấn

Tôi có một trang web sử dụng React và React Router, có nghĩa là tôi có một số URL tải giống hệt HTML và JS và sau đó JS tìm ra phần nào của ứng dụng để tải dựa trên URL.

Ví dụ:

/foo,/bar,/baz tất cả phải tải index.html, tải bundle.js. Sau đó bundle.js quan sát URL và các tuyến đường đến một số thành phần React (cũng trong bundle.js).

Tuy nhiên không có tệp foo, bar hoặc baz nào tồn tại trong S3, chỉ index.html. Những gì tôi muốn làm là khi tôi nhận được 404, chuyển hướng đến/#!/{URL} (ví dụ:/foo chuyển hướng đến/#!/Foo). Điều này làm việc tốt với quy tắc chuyển hướng của tôi (bên dưới). Tuy nhiên, tôi cũng muốn mang thông số truy vấn với tôi (ví dụ:/foo? Ping = pong chuyển hướng đến/#!/Foo? Ping = pong) nhưng thay vì/foo? Ping = pong chỉ chuyển hướng đến/#!/Foo.

Dưới đây là quy tắc chuyển hướng của tôi:

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

Bất kỳ ý tưởng về một số cách tôi có thể đạt được điều này? Lý tưởng nhất mà không cần phải thay đổi một cái gì đó trong S3/CloudFront mỗi khi tôi thêm một trang mới?

+0

Hết sức tò mò, hoạt động như thế nào?/Foo /? Ping = pong' như mong đợi? (thêm dấu gạch chéo trước dấu '? ') –

+0

Bài đăng chéo ... https://stackoverflow.com/questions/20751301/how-can-i-get-query-strings-in-my-amazon-s3-static -website – doublejosh

Trả lời

17

Vấn đề là tôi đã có nguồn gốc được thiết lập trong CloudFront không chuyển tiếp chuỗi truy vấn để khi S3 nhận được yêu cầu, nó sẽ chuyển hướng đúng mà không có tham số truy vấn. Bạn có thể tìm thấy cài đặt này trong CloudFront> Hành vi> Chuỗi truy vấn chuyển tiếp.

+1

Có !! Lifesaver! –

+0

Có thể bảo toàn các tham số truy vấn không có CloudFront không? – doublejosh

+0

@doublejosh: Bạn có nghĩa là chỉ cần nhấn lên S3 trực tiếp? Truy vấn params không nên bỏ qua sau đó. Trong trường hợp của tôi, CloudFront đã xóa các tham số truy vấn, đó là vấn đề của tôi. Nếu bạn không sử dụng CloudFront, bạn không nên gặp sự cố tương tự. –

2

Nếu bạn muốn có url rõ ràng mặc dù bạn cũng có thể xem this trick. Bạn cần thiết lập phân phối trên đám mây và sau đó thay đổi hành vi 404 trong phần "Trang lỗi" trong phân phối của bạn. Bằng cách đó, bạn có thể một lần nữa các liên kết domain.com/foo/bar :)

+0

Cảm ơn mẹo - Tôi đã thử thiết lập tính năng này trong đám mây nhưng khi Tôi nhìn vào tab nguồn trong trình kiểm tra Chrome, đang tải trang index.html dưới dạng tệp bundle.js của tôi và vì vậy tôi nhận được lỗi 'token token <'. URL trang web của tôi là từ 'https://mydomain.io/search/0.1/index.html/article/uuid. Và trong router phản ứng, tôi có một tên cơ sở là 'search/0.1/index.html 'nên một trong các định nghĩa tuyến đường là cho' article /: id'. S3 dường như vẫn đang tìm thư mục '/ search/0.1/index.html/article'. Bất kỳ ý tưởng nào về cách tôi có thể giải quyết vấn đề này? –

Các vấn đề liên quan