同一VPS上前后端主域名与子域名跨域连接问题求助
同一VPS上前后端主域名与子域名跨域连接问题求助
看起来你碰到了典型的CORS跨域拦截问题,浏览器因为没检测到后端返回的Access-Control-Allow-Origin响应头,直接阻止了前端对后端接口的请求。我先帮你梳理下现有配置里的问题,再给出可行的修复方案:
你遇到的错误提示
Access to XMLHttpRequest at 'https://api.savoury.es/api/user/' from origin 'https://savoury.es' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
现有Nginx后端配置的问题点
从你贴出的配置片段来看,有两个关键问题导致了这个错误:
- 域名中的多余空格:你写的
'https: // savoury .es'包含不必要的空格,浏览器会把这个识别为无效的源地址,等于没正确设置允许跨域的源。 - 未处理OPTIONS预检请求:对于PUT、DELETE这类非简单请求,浏览器会先发OPTIONS预检请求确认权限,但你的配置里没有专门处理这个请求的响应逻辑,导致预检失败,进而触发跨域拦截。
修复后的Nginx后端配置
把你的后端Nginx配置替换成下面的内容,注意去掉多余空格,补上OPTIONS请求的处理:
server { listen 80; server_name api.savoury.es; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name api.savoury.es; ssl_certificate /etc/letsencrypt/live/api.savoury.es/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.savoury.es/privkey.pem; # CORS 核心配置 add_header 'Access-Control-Allow-Origin' 'https://savoury.es' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always; # 专门处理 OPTIONS 预检请求,直接返回204无内容 if ($request_method = OPTIONS) { return 204; } # 这里请补充你后端应用的代理转发配置,比如: # location / { # proxy_pass http://localhost:你的后端服务端口; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # } }
额外注意事项
- 保留
always参数:这样即使后端返回4xx/5xx错误状态码,CORS响应头也会被发送,避免错误场景下依然出现跨域问题。 - 自定义请求头的处理:如果你的前端请求带有自定义头(比如
Authorization令牌),一定要在Access-Control-Allow-Headers里添加对应的头名称。 - 配置生效:修改完成后记得重启Nginx服务:
sudo systemctl restart nginx,然后清除浏览器缓存再测试接口连接。
备注:内容来源于stack exchange,提问作者yeraki
相关产品推荐
相关产品推荐

