Как избежать предварительных запросов CORS в одностраничных приложениях?
Во-первых, вы не можете "избежать" чего-то, что является частью стандарта. Во-вторых, этот вопрос сформулирован неправильно, поскольку сами SPA могут использовать или не использовать CORS. Это полностью зависит от вашей установки / дизайна. Если вы хотите избежать предварительной проверки, просто не запрашивайте ресурсы из других источников.
Можно ли избежать этих предварительных запросов, если оба домена принадлежат одному и тому же объекту?
Нет.
Владение сайтом не имеет ничего общего с CORS. Обмен ресурсами между источниками означает, что вы хотите обмениваться ресурсами между различными источниками . Не обязательно между разными доменами. Происхождение не является ни сущностью, ни владельцем. Origin - это только часть URL-адреса.
Лучшее решение состоит в том, чтобы вообще не создавать проблему CORS и всегда придерживаться того же источника. Ваше предположение о том, что вы должны отделять внутренний API-интерфейс от внешних ресурсов с разными источниками, неверно.
Добавление нескольких источников и доменов в настройку добавляет больше проблем, чем решает. В идеале вся ваша настройка должна быть скрыта от подключающихся клиентов и сведена к одному домену и источнику.
Требуемая настройка
-> static file server
CDN -> Load balancer -> api server
-> api server
-> ...
Пример конфигурации
Использование балансировщика нагрузки и его правила ACL. Скажите, чтобы все трафики c были направлены туда, куда go. Я буду использовать haproxy в качестве примера, потому что это то, что я использую, и потому что, насколько я знаю, это в значительной степени отраслевой стандарт с точки зрения программного решения для балансировки нагрузки.
Это не так весь конфиг, только соответствующая часть, касающаяся маршрутизации трафика c.
# part of haproxy configuration file, usually located at /etc/haproxy/haproxy.cfg
frontend http-in # this is where requests get in to load balancer
bind *:80
acl data path_beg /api # "catch" any request with path beginning with "/api"
use_backend api if data # then route it to api backend defined below
default_backend static # any non-matching request we direct to static file server
backend static
server node1 127.0.0.1:3000 # server hosting static files (index.html)
backend api
server node1 127.0.0.1:4000 # application servers
server node2 ...