Лучший способ: Access-Control-Allow-Origin Несколько областей происхождения

Этот вопрос задавался здесь раньше и давался массив хороших ответов, в основном: Access-Control-Allow-Origin Несколько доменов происхождения?

Однако, похоже, существует пробел в объяснении с точки зрения утвержденного метода, который должен быть предпринят. Чтение документации W3 имеет то, что кажется мне противоречием.

Во-первых, мы видим ответ, приведенный как правильный способ сделать это во многих предыдущих ответах, в которых указывается, что хост-сервер должен динамически откликнуться на заданный "Origin", если он появляется в предопределенном "белом списке". http://www.w3.org/TR/cors/#resource-implementation

Однако многие ответы и используемые методы также ссылаются на список с разделителями пробелов, который также может использоваться как метод передачи нескольких "Origins" для разрешения. Если мы рассмотрим еще одну часть документации W3 на http://www.w3.org/wiki/CORS_Enabled, мы видим пример этого в первом разделе страницы:

 Access-Control-Allow-Origin: http://example.com:8080 http://blah.example.com http://foo.example.com

Из этих двух методов я был бы в равной степени счастлив, если бы был неравномерным, однако может существовать большой список URL-адресов, которые нужно будет включать в список, и поэтому я хотел убедиться, что я делаю это в первую очередь. Если у кого-то есть представление о двух упомянутых выше методах, я был бы очень благодарен за услышанное решение в ваших вариантах, и если будет окончательное руководство к рекомендуемому методу, я, возможно, пропустил.

Ответы

Ответ 1

Документация по этому вопросу, по-видимому, подразумевает, что она допускает множественное происхождение с разделенным пробелом списком, но это не то, что на самом деле означает. Вот что я мог бы получить в качестве наиболее окончательного ответа на ваш вопрос: заголовок Access-Control-Allow-Origin должен быть таким же значением, что и заголовок Origin, если вы хотите его разрешить.

Причина, по которой он не является белым списком, который вы отправляете обратно клиенту, заключается в том, что по техническим причинам клиент может отправить список источников, разделенных пробелами, чтобы сервер мог проверить запрос. Назначение списка происхождения тогда состоит в том, что запрос мог быть получен из нескольких источников (т.е. Запрос был перенаправлен по доменам). Набор тестов позволяет легко наблюдать это поведение с различными возможностями переадресации, даже если список, разделенный пробелом, никогда не создается (по крайней мере, Firefox).

Это показано ниже в первом связанном документе W3C, который вы предоставили:

Заголовок Access-Control-Allow-Origin указывает, может ли ресурс делиться на основе возврата значения заголовка запроса Origin, "*" или "null" в ответе. ABNF:

Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"

На практике производство origin-list-or-null более ограничено. Вместо того, чтобы разрешать список источников, разделенных пробелами, это либо одно происхождение, либо строка "null" .

И снова в определение списка происхождения. Кроме того, он показывает, хотите ли вы разрешить строку "null" в качестве источника, в любом случае она не сможет быть включена в список происхождения.

Итак, придерживайтесь динамически сгенерированного заголовка на основе клиентского Origin заголовка и соответствует ли ваш белый список.