默认响应和头部
编辑页面
使用 EAS Hosting 时,系统会自动添加到请求中的默认值。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
EAS Hosting 会将一些默认值应用到你的部署中,这些默认值旨在帮助你,并减少在简单 API 路由中需要自己添加的代码量。
资源响应
资源响应包含额外的元数据头,供浏览器使用,主要用于缓存。
默认会向所有资源响应添加 ETag 头,以允许浏览器使用 if-none-match 请求头重新验证其缓存。
CORS 响应
默认情况下,如果某个 API 路由未处理 OPTIONS 请求,EAS Hosting 会自动返回一个默认的 CORS 响应。
这个默认值非常宽松,通常允许所有浏览器向该 API 路由发起请求。如果你不想这样,请在 API 路由中自行处理 OPTIONS 请求。
默认会发送以下头部:
Access-Control-Allow-Origin: <origin || '*'> Access-Control-Allow-Headers: <access-control-request-headers || '*'> Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Allow-Credentials: true Access-Control-Expose-Headers: * Access-Control-Max-Age: 3600 Vary: Origin, Access-Control-Request-Headers
这些头部将允许任何客户端从任何来源发起请求,携带任意头部和凭据,并将 OPTIONS 响应缓存 3600 秒。
关于预检 OPTIONS 请求的更多信息,可参阅 MDN 文档。
Strict-Transport-Security 头部
此头部告诉浏览器未来只能使用 HTTPS 协议访问某个 URL。如果缺失,EAS Hosting 会自动添加该头部。
其默认值设置为 max-age=31536000; includeSubDomains; preload。
关于为什么这是一个良好的默认设置、以及如何提升安全性和性能的更多信息,请阅读这篇 web.dev 文章,并在 MDN 文档中进一步了解 Strict-Transport-Security 头部。
常见头部
默认情况下,EAS Hosting 会移除并且不会转发任何 X-Powered-By 和 X-Aspnet-Version 头部。对于 API 路由来说,这类头部并没有太大作用,我们也不建议你在 API 路由中添加替代性的头部,比如 X-Powered-By,因为这会不必要地暴露你所运行代码的内部信息。
如果你的 API 路由响应中包含自定义的 X-Frame-Options 头部,这些头部会自动转换为响应中的 Content-Security-Policy 指令。
崩溃页面
如果你的 API 路由抛出了未处理的 JavaScript 错误,则会被视为“崩溃”,因为你的 API 路由无法返回错误响应。
在这些情况下,EAS Hosting 会返回一个错误页面。如果发送了 Accept: text/html 请求头,则该错误页面会以 HTML 响应形式渲染。否则,它只会返回纯文本响应。
请求头
EAS Hosting 会在转发到你的 API 路由之前,为每个请求添加以下头部。这些头部通常会提供更多关于请求发起者的信息。
| 请求头 | 描述 |
|---|---|
Forwarded | 由分号分隔的 for、host 和 proto 参数组成的逗号分隔列表。更多信息请参阅 MDN 文档中关于 HTTP Forwarded 头部 的说明。 |
X-Forwarded-For | 某次请求的转发者 IP 地址逗号分隔列表 |
X-Forwarded-Proto | 用于发起请求的协议。通常为 https |
X-Forwarded-Host | 来自传入请求的主机名 |
X-Real-IP | 来自传入请求的 IP 地址 |
Origin | 来自传入请求的 URL Origin |
Host | 转发请求的主机名(与 request.url 的 hostname 匹配) |
eas-colo | 处理该请求的 Cloudflare 数据中心代码。例如,lhr |
eas-ip-continent | 客户端所在大洲的两字母代码。 其中之一: AF、AN、AS、EU、NA、OC 或 SA |
eas-ip-country | 客户端的三字母国家代码,采用 ISO-3166 Alpha 2 格式。 例如, US 或 JP |
eas-ip-region | 客户端的地区代码,采用 ISO-3166-2 格式,最大长度为三个字符 |
eas-ip-city | 客户端的可读城市名称(可选)。例如,London 或 Chicago |
eas-ip-latitude | 对客户端纬度的最佳估计(可选) |
eas-ip-longitude | 对客户端经度的最佳估计(可选) |
eas-ip-timezone | 客户端的时区。例如,Europe/London |
eas-ip-eu | 当请求很可能源自欧盟司法辖区时,设为 1 |
请求 URL 和来源
EAS Hosting 会将来自多个主机名的请求路由到你的部署。别名 和 自定义域名 意味着,客户端用于发起请求的 传入 URL 与你的 API 路由接收到的 目标 URL 之间可能存在差异。
例如,客户端可能会请求像 https://my-app--staging.expo.app/ 这样的别名 URL,而接收该请求的 worker 部署将拥有一个包含其部署 ID 的 URL,例如 https://my-app--or1170q9ix.expo.app/。
这种差异同样体现在你在 API 路由中收到的 Request 的 URL 和头部中。虽然 request.url 会是你的 worker 部署 URL,但 Origin 和 X-Forwarded-Host 头部将被设置为客户端用于发起请求的传入 URL。
export async function GET(request) { request.url; // 'https://my-app--or1170q9ix.expo.app/' request.headers.get('Origin'); // 'https://my-app--staging.expo.app/' request.headers.get('X-Forwarded-Host'); // 'my-app--staging.expo.app' origin; // 'https://my-app--staging.expo.app/' }
IP 头部
请求包含多个用于识别发起请求的用户设备 IP 地址的头部:
Forwarded包含一个由逗号分隔、且各项内部由分号分隔的参数列表。列表中的每一项都代表一个转发该请求的代理。因此,第一项中的for参数很可能是原始客户端的 IP 地址。X-Forwarded-For只包含一个 IP 地址的逗号分隔列表。列表中的每一项同样代表一个转发该请求的代理。X-Real-IP只包含原始请求的 IP 地址
例如,要获取调用你的 API 路由的用户浏览器的 IP 地址,请从请求中读取 X-Real-IP 头部:
export async function GET(request) { const ip = request.headers.get('X-Real-IP'); }
地理位置头部
请求还包含多个带有请求来源地理信息的头部:
eas-colo包含处理你请求的数据中心的 Cloudflare 代码。例如,lhr。eas-ip-continent包含当前请求所在大洲的代码:AF代表非洲AN代表南极洲AS代表亚洲EU代表欧洲NA代表北美洲OC代表大洋洲SA代表南美洲。
eas-ip-country包含 ISO-3166 Alpha 2 国家代码。该值最多为两个字母。例如,US或JP。eas-ip-region包含该请求的 ISO-3166-2 地区代码。此值最长为三个字符。不过,它会根据特定国家/地区针对所请求来源的地区代码规则而有所不同。它可能由一到三个数字、一到三个字母或其他任意组合构成。eas-ip-city可能包含城市的可读名称。例如London或Chicago。eas-ip-latitude和eas-ip-longitude包含该请求的大致纬度和经度。eas-ip-timezone包含该请求来源时区的最佳估计。例如,Europe/Londoneas-ip-eu在请求很可能源自欧盟司法辖区时,设为1。