web-dev-qa-db-ja.com

AmazonS3リダイレクトルール-クエリパラメータを保持する

Amazon S3リダイレクトルール-GETデータがありません に気づきましたが、受け入れられた回答に従った後でも、クエリパラメータが保持されていません。

ReactおよびReactルーターを使用するサイトがあります。つまり、同一のHTMLとJSをロードするURLがいくつかあり、JSがその部分を特定します。 URLに基​​づいてロードするアプリ。

例えば:

/ foo、/ bar、/ bazはすべて、bundle.jsをロードするindex.htmlをロードする必要があります。次に、bundle.jsはURLを監視し、いくつかのReactコンポーネント(bundle.jsにもあります)にルーティングします。

ただし、S3にはfoo、bar、またはbazファイルは存在せず、index.htmlのみが存在します。私がやりたいのは、404を取得したら、/#!/ {URL}にリダイレクトすることです(たとえば、/ fooは/#!/ fooにリダイレクトします)。これは私のリダイレクトルール(下記)でうまく機能します。ただし、クエリパラメータも持ち込みたいのですが(例:/ foo?ping = pongは/#!/ foo?ping = pongにリダイレクトされます)、代わりに/ foo?ping = pongは/#!/ fooにリダイレクトされます。

これが私のリダイレクトルールです:

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

これを達成するための何らかのアイデアはありますか?理想的には、新しいページを追加するたびにS3/CloudFrontで何かを変更する必要はありませんか?

20

問題は、クエリ文字列を転送しないようにCloudFrontでOriginを設定していたため、S3がリクエストを取得すると、クエリパラメータなしで適切にリダイレクトされることでした。この設定は、CloudFront> Behaviors> Forward QueryStringsにあります。

28

明確なURLが必要な場合は、チェックアウトすることもできます このトリック 。クラウドフロントディストリビューションをセットアップしてから、ディストリビューションの「エラーページ」セクションで404の動作を変更する必要があります。そうすれば、再びdomain.com/foo/barリンク:)

2
Adrian Serafin