重定向和重写示例参考 - AWS Amplify 托管

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

重定向和重写示例参考

本节中包括适用于多种常见重定向情景的示例代码。您可以通过这些示例来了解创建自己的重定向和重写的语法。

注意

原始地址域匹配不区分大小写。

简单重定向和重写

您可以使用以下示例代码将特定页面永久地重定向到新地址。

原始地址 目标地址 重定向类型 国家/地区代码

/original.html

/destination.html

permanent redirect (301)

JSON [{"source": "/original.html", "status": "301", "target": "/destination.html", "condition": null}]

您可以使用以下示例代码将一个文件夹下的任何路径都重定向到不同文件夹下的同一路径。

原始地址 目标地址 重定向类型 国家/地区代码

/docs/<*>

/documents/<*>

permanent redirect (301)

JSON [{"source": "/docs/<*>", "status": "301", "target": "/documents/<*>", "condition": null}]

您可以使用以下示例代码以重写的方式将所有流量都重定向到 index.html。在此情景中,重写使用户看来他们到达了原始地址。

原始地址 目标地址 重定向类型 国家/地区代码

/<*>

/index.html

rewrite (200)

JSON [{"source": "/<*>", "status": "200", "target": "/index.html", "condition": null}]

您可以使用以下示例代码来通过重写更改显示给用户的子域。

原始地址 目标地址 重定向类型 国家/地区代码

https://mydomain.com

https://www.mydomain.com

rewrite (200)

JSON [{"source": "https://mydomain.com", "status": "200", "target": "https://www.mydomain.com", "condition": null}]

您可以使用以下示例代码重定向到带有路径前缀的其他域。

原始地址 目标地址 重定向类型 国家/地区代码

https://mydomain.com

https://www.mydomain.com/documents

temporary redirect (302)

JSON [{"source": "https://mydomain.com", "status": "302", "target": "https://www.mydomain.com/documents/", "condition": null}]

您可以使用以下示例代码将找不到的文件夹下的路径重定向到自定义 404 页面。

原始地址 目标地址 重定向类型 国家/地区代码

/<*>

/404.html

not found (404)

JSON [{"source": "/<*>", "status": "404", "target": "/404.html", "condition": null}]

单页 Web 应用程序 (SPA) 的重定向

大多数 SPA 框架支持 HTML5 history.pushState() 更改浏览器位置,而不发起服务器请求。这适用于从根(或 /index.html)开始的用户,但不适用于直接导航到任何其他页面的用户。

以下示例使用正则表达式将所有文件设置到 index.html 的 200 重写,但正则表达式中指定的特定文件扩展名除外。

原始地址 目标地址 重定向类型 国家/地区代码

</^[^.]+$|\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|woff2|ttf|map|json|webp)$)([^.]+$)/>

/index.html

200

JSON [{"source": "</^[^.]+$|\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|woff2|ttf|map|json|webp)$)([^.]+$)/>", "status": "200", "target": "/index.html", "condition": null}]

反向代理重写

以下示例对来自其他位置的代理内容使用重写以便在用户看来域未更改。

原始地址 目标地址 重定向类型 国家/地区代码

/images/<*>

https://images.otherdomain.com/<*>

rewrite (200)

JSON [{"source": "/images/<*>", "status": "200", "target": "https://images.otherdomain.com/<*>", "condition": null}]

结尾斜杠和清洁网址

为创建清洁网址结构(如 about 而不是 about.html),静态站点生成器(如 Hugo)会为具有 index.html (/about/index.html) 的页面生成目录。Amplify 通过在需要时添加结尾斜杠来自动创建清洁网址。下表重点介绍了几种不同情景:

用户在浏览器中的输入 地址栏中的网址 提供的文档

/about

/about

/about.html

/about (when about.html returns 404)

/about/

/about/index.html

/about/

/about/

/about/index.html

占位符

您可以使用以下示例代码将一个文件夹结构中的路径重定向到另一个文件夹中的匹配结构。

原始地址 目标地址 重定向类型 国家/地区代码

/docs/<year>/<month>/<date>/<itemid>

/documents/<year>/<month>/<date>/<itemid>

permanent redirect (301)

JSON [{"source": "/docs/<year>/<month>/<date>/<itemid>", "status": "301", "target": "/documents/<year>/<month>/<date>/<itemid>", "condition": null}]

查询字符串和路径参数

您可以使用以下示例代码将路径重定向到其名称与原始地址中的查询字符串元素值匹配的文件夹:

原始地址 目标地址 重定向类型 国家/地区代码

/docs?id=<my-blog-id-value

/documents/<my-blog-post-id-value>

permanent redirect (301)

JSON [{"source": "/docs?id=<my-blog-id-value>", "status": "301", "target": "/documents/<my-blog-id-value>", "condition": null}]

注意

Amplify 会将所有查询字符串参数转发到 301 和 302 重定向的目标路径。但是,如果原始地址包含设置为特定值的查询字符串(如本示例所示),Amplify 不会转发查询参数。在这种情况下,重定向仅适用于向具有指定查询值 id 的目标地址发出的请求。

您可以使用以下示例代码将在文件夹结构的给定级别上找不到的所有路径都重定向到指定文件夹中的 index.html。

原始地址 目标地址 重定向类型 国家/地区代码

/documents/<folder>/<child-folder>/<grand-child-folder>

/documents/index.html

not found (404)

JSON [{"source": "/documents/<x>/<y>/<z>", "status": "404", "target": "/documents/index.html", "condition": null}]

基于区域的重定向

您可以使用以下示例代码来基于区域重定向请求。

原始地址 目标地址 重定向类型 国家/地区代码

/documents

/documents/us/

temporary redirect (302)

<US>

JSON [{"source": "/documents", "status": "302", "target": "/documents/us/", "condition": "<US>"}]

在重定向和重写中使用通配符表达式

您可以在原始地址中为重定向或重写使用通配符表达式 <*>。必须将表达式放在原始地址的末尾,而且该表达式必须唯一。Amplify 会忽略包含多个通配符表达式的原始地址,或者将其用在不同的放置中。

以下是使用通配符表达式的有效重定向示例。

原始地址 目标地址 重定向类型 国家/地区代码

/docs/<*>

/documents/<*>

permanent redirect (301)

以下两个示例展示了使用通配符表达式的无效重定向。

原始地址 目标地址 重定向类型 国家/地区代码

/docs/<*>/content

/documents/<*>/content

permanent redirect (301)

/docs/<*>/content/<*>

/documents/<*>/content/<*>

permanent redirect (301)