在 PHP 项目中,你会采取哪些措施来解决跨域请求(CORS)问题?请描述常见的解决方案及其适用场景。
考察说明
考察候选人对跨域请求原理及在 PHP 项目中处理方法的理解。
回答思路
- 【回答框架 1】跨域请求由浏览器的同源策略引起,限制不同源(协议、域名、端口任一不同)的请求。处理 CORS 的主要方式是在服务端设置响应头,如 Access-Control-Allow-Origin。
- 【回答框架 2】在 PHP 中,可以通过设置 HTTP 响应头来实现,例如 header('Access-Control-Allow-Origin: *') 允许所有来源,但生产环境应限制为具体域名。同时需处理预检请求(OPTIONS),并设置 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers。
- 【回答框架 3】除了 CORS,还可使用代理(如 Nginx 反向代理)或 JSONP(仅支持 GET,且有局限性)。现代开发中,CORS 是首选,代理用于规避浏览器限制或整合 API。
- 【回答框架 4】需要处理请求方法(GET、POST、PUT 等)、自定义请求头、携带凭证(未设置 Access-Control-Allow-Credentials 时,浏览器会拒绝携带 Cookie 的请求)。
- 【关键点 1】CORS 是解决跨域的主流方案,通过服务端响应头控制。
- 【关键点 2】在 PHP 中设置 header() 即可,但需正确响应 OPTIONS 预检。
- 【关键点 3】生产环境应限制 Access-Control-Allow-Origin 为具体域名,避免使用 *。
- 【关键点 4】若需要携带 Cookie,必须设置 Access-Control-Allow-Credentials 为 true。
- 【关键点 5】代理和 JSONP 是备选方案,但各有局限。
- 【易错点 1】只设置 Access-Control-Allow-Origin 而忽略预检请求,会导致复杂请求失败。
- 【易错点 2】使用 * 和 Allow-Credentials 同时存在会触发浏览器错误。
- 【易错点 3】JSONP 不支持 POST 请求,且有安全风险。