Общий хостинг, запускающий CORS с тем же доменом и портом

Последние пару дней компания A боролась с CORS, в частности с запросами предварительной проверки в конфигурации, отличной от CORS. Я отправляю запрос из приложения SPA через axios (domain.com:80) в API отдыха (domain.com:80/api) и его классифицируется как запрос CORS . Локально, с той же настройкой, запросы обрабатываются и не запускают предполетные.

В моем исследовании один и тот же запрос происхождения должен иметь:

  • тот же домен
  • тот же субдомен
  • тот же порт
  • тот же протокол

Я думаю, что моя производственная среда проверяет все вышеперечисленное, но что-то говорит об обратном.

Моя среда размещается у провайдера с общим хостом следующим образом:

SPA (Vue) - http: / domain: 80 / company-name /
API (Laravel) - http: / domain: 80 / company-name / api

Я уже пробовал:

  • Клонирование среды локально (работает нормально - не отправляет предпечатные запросы)
  • Включить / отключить Access-Control-Allow-Headers
  • Если честно, я даже не знаю, что попробовать дальше: |

Решение этой проблемы сделает мое приложение на 100% быстрее, поэтому для меня это очень важно. Но в этом просто нет смысла. Может, я упускаю что-то очевидное.

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

Пример предпечатного запроса (из вкладки сети в инструментах разработчика):

Общие
URL-адрес запроса: http: / domain / company-name / api / perfil / 3
Метод запроса: OPTIONS
Код состояния: 200 OK
Удаленный адрес: 185.200.153.100:80
Политика реферера: без реферера при понижении версии

Заголовки ответа
Access-Control-Allow-Headers: AUTHORIZATION
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: http: / domain
Access-Control-Max-Age: 25200
Cache-Control: без кеша, частный
Соединение: закрыть
Content-Length: 0
Content-Type: text / html; charset = UTF-8
Дата: Сб, 27 апреля 2019 г. 18:28:40 GMT
Сервер: Apache

Заголовки запроса
Отображаются предварительные заголовки
Заголовки запроса-контроля доступа: авторизация
Метод-запроса-контроля доступа: GET
Источник: http: / domain < br> Referer: http: / domain / company-name / perfis
User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 73.0.3683.103 Safari / 537.36

Пример запроса (сразу после предполетного ответа):

Общие
URL-адрес запроса: http: / domain / company-name / api / perfil / 3
Метод запроса: GET
Код состояния: 200 OK
Удаленный адрес: < strong> 185.200.153.100:80
Политика реферера: без реферера-при-понижении

Заголовки ответа
Accept-Ranges: байты
Access-Control-Allow-Origin: http: / domain
Access-Control-Expose-Headers: *
Возраст: 0
Cache-Control: no-cache, private
Соединение: keep-alive
Content-Type: application / json
Дата: Сб, 27 апреля 2019 г., 18:28:41 GMT
Сервер : Apache
Кодирование передачи: фрагментировано
Варьируется: Происхождение, Авторизация
Через: 1.1 varnish-v4
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-Varnish: 46418125

Заголовки запроса
Принять: application / json, text / plain, /
Авторизация: предъявитель {токен}
Источник: http: / domain
Referer: http: / domain / company-name / perfis
User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36
(KHTML, как Gecko) Chrome / 73.0.3683.103 Safari /537.36

домен / .htaccess

<IfModule mod_rewrite.c>

  RewriteEngine On
  RewriteBase /
  RewriteRule ^(api)($|/) - [L]
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css|woff2)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

домен / api / .htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Если нужны другие данные, не стесняйтесь спрашивать.


person Guilherme Frota    schedule 27.04.2019    source источник
comment
Какое именно сообщение об ошибке регистрируется браузером в консоли разработчика? Заголовки запроса, показанные в вопросе, не указывают на какие-либо ошибки; вместо этого они указывают, что ваш сервер отправляет обратно заголовки Access-Control-Allow- *, которые вы настроили для отправки.   -  person sideshowbarker    schedule 28.04.2019
comment
@sideshowbarker нет ошибки, это просто наличие предполетных запросов в этой среде, что не имеет смысла. Для меня отправка запроса с domain.com на domain.com/api не должна вызывать никаких предпечатных запросов.   -  person Guilherme Frota    schedule 28.04.2019
comment
Поскольку вы не показываете настоящие URL-адреса в сообщениях об ошибках в вопросе, никто не сможет вам помочь. Но если ваш браузер делает предварительный запрос OPTIONS, то на самом деле ваш интерфейсный код пытается сделать запрос с перекрестным происхождением. Таким образом, URL-адрес, на который вы отправляете запрос, не совпадает с источником вашего кода внешнего интерфейса.   -  person sideshowbarker    schedule 28.04.2019
comment
@sideshowbarker, это не ошибки, я просто копирую и вставляю их со вкладки сети в инструментах chrome dev. Извините, но я не могу поделиться настоящими URL-адресами и IP-адресами ... Как я могу проверить происхождение из обеих кодовых баз? Я предполагаю, что удаленные адреса должны быть одинаковыми, верно?   -  person Guilherme Frota    schedule 28.04.2019
comment
Что касается проверки URL-адресов, то часть «домен» должна быть точно такой же. Так, например, «api.domain.com» и «www.domain.com» - это два разных источника. Заголовки, которые вы скопировали из вкладки «Сеть», показывают «Origin: http: / domain» и «http: / domain / company-name / api / perfil / 3». Итак, я говорю вам, что происхождение любого реального URL-адреса http: / domain / company-name / api / perfil / 3 не совсем соответствует тому, чем на самом деле является Origin: http: / domain. Либо часть «домен» не совсем то же самое, либо они не являются одновременно «http» или «https», либо есть какой-то номер порта, который вы пропустили.   -  person sideshowbarker    schedule 29.04.2019
comment
Другими словами, заголовки ответов указывают, что ваш код внешнего интерфейса находится в http: / domain / company-name / perfis, а ваш код делает запрос на http: / domain / company-name / api / perfil / 3. Но на самом деле настоящие части этих URL-адресов http: / domain действительно точно совпадают. Если бы они точно совпадали, ваш браузер не отправлял бы заголовок Origin в запросе и не выполнял бы предварительный вызов OPTIONS.   -  person sideshowbarker    schedule 29.04.2019
comment
Что касается вашего вопроса «Как я могу проверить происхождение из обеих кодовых баз»?, Откройте инструменты разработчика браузера и вставьте document.defaultView.location.origin в консоль.   -  person sideshowbarker    schedule 29.04.2019
comment
Что касается вашего вопроса: «Я предполагаю, что удаленные адреса должны быть одинаковыми», ответ заключается в том, что для целей определения источника удаленный адрес не имеет значения для браузера. . Браузер этого не проверяет. Но даже если удаленный адрес точно такой же, этого недостаточно, чтобы сделать URL-адреса одинаковыми по происхождению - потому что, например, вы можете использовать виртуальный хостинг на своем веб-сервере, так что веб-сервер управляет несколькими хостами одновременно. Айпи адрес. например, у вас есть api.domain.com и www.domain.com с одним и тем же IP-адресом.   -  person sideshowbarker    schedule 29.04.2019
comment
@sideshowbarker большое спасибо за терпение! Я убедил меня, что оба URL-адреса равны, но я был просто слеп из-за того, что у одного из них был www. а другой нет. Я понятия не имел, что www. когда-нибудь префикс доставит мне столько неприятностей. В наши дни мы считаем само собой разумеющимся отсутствие www. но это имеет свои последствия. ДЕЛО ЗАКРЫТО   -  person Guilherme Frota    schedule 29.04.2019


Ответы (1)


Может быть, я упускаю что-то очевидное.

Ага.

В СПА я получал domain/api, когда действительно www.domain/api был правым. Обеспечение совпадения исходного URL-адреса с URL-адресом запроса, как объяснил @sideshowbarker

Что касается проверки URL-адресов, то часть «домен» должна быть точно такой же. Так, например, «api.domain.com» и «www.domain.com» - это два разных источника. Заголовки, которые вы скопировали из вкладки «Сеть», показывают «Origin: http: / domain» и «http: / domain / company-name / api / perfil / 3». Итак, я говорю вам, что происхождение того, чем на самом деле является настоящий URL-адрес http: / domain / company-name / api / perfil / 3, не совсем соответствует тому, чем на самом деле является Origin: http: / domain. Либо часть «домен» не совсем то же самое, либо они не являются одновременно «http» или «https», либо есть какой-то номер порта, который вы пропустили.

person Guilherme Frota    schedule 29.04.2019