Научный консалтинг
Главная
Контакты
Номер телефона
Как мы работаем
Гарантии
Условия
Цены

Последнее обновление:

AJAX запросы на поддомен WWW без использования CORS

При направлении AJAX-запросов на разные домены современные браузеры блокируют такие запросы, что сделано в целях безопасности пользователя. В частности, политика такого блокирования подразумевает, что могут отправляться запросы:

  • С одного домена на тот же самый домен
  • По одному и тому же протоколу
  • На один и тот же порт

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

Проще говоря, страница, загруженная с конкретного домена. по конкретному протоколу и порту, может обратиться в сеть интернет ТОЛЬКО с использованием точно таких же параметров. Т.е. если страница загружена по протоколу http, то и запрос она способна посылать только по этому же протоколу; тогда как запрос по протоколу https будет заблокирован браузером.

Однако, иногда все-таки требуются иные запросы

Т.е. такие, которые направляются на другой домен или используют другой протокол. Такие запросы называются кроссдоменными. Для их реализации может быть использовано включение политики CORS. Мы не будем разъяснять, что это за политика, ибо в сети информации на эту тему много.

Однако, в некоторых частных случаях можно обойтись без этого.

Как направить запрос на поддомен WWW без включения политики CORS

Сам по себе поддомен WWW – историческое следствие архитектуры сайтов, существовавших ранее (лет 15...20 назад). В настоящее время этот поддомен является, по сути, анахронизмом. Тем не менее, до сих пор поисковые системы (Google, Яндекс) считают, что страницы, содержащие в адресе этот поддомен и без него – являются разными. Т.е. "разными" будут страницы вида

http://www.dissertacii-diplom-ufa.ru

и

http://dissertacii-diplom-ufa.ru

Другое дело, что поисковики их, как правило, склеивают и в поиске присутствует лишь одна из них, именуемая главным зеркалом сайта.

Вообще, конечно, страницы вида http://www.dissertacii-diplom-ufa.ru и http://www.dissertacii-diplom-ufa.ru/ также считаются разными. Но, они являются одинаковыми в рамках политики CORS.

Самое интересное, что ряд (если не все) браузеров считают иначе. И, если попытаться направить запрос с одной из указанных страниц на другую, браузер, скорее всего, выдаст ошибку, сообщение о которой будет выглядеть примерно следующим образом (на примере браузера Firefox for developers 35):


Пример ошибки кроссдоменного запроса AJAX

Как видим, адрес страницы содержит поддомен WWW, но она пытается направить AJAX-запрос (типа POST) на страницу, этого поддомента не содержащую. Что браузеру не нравится.

Диагностика сообщения браузера проводилась при помощи известного плагина Firebug. Можно также использовать «Инструменты разработчика», например, Веб-консоль, Инспектор или т.п. Иначе браузер «виду не подаст», т.е. запрос просто не будет направлен, но ошибку браузер не покажет.

Самое интересное, что запрос на сервер все-таки уходит:

POST /***.php HTTP/1.1
Host: dissertacii-diplom-ufa.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://www.dissertacii-diplom-ufa.ru/........
Content-Length: 192
Origin: http://www.dissertacii-diplom-ufa.ru
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Видно, кстати, что раз запрос является кроссдоменным, браузер автоматически добавил в него заголовок Origin, в котором указал страницу - адресат запроса.

И сервер даже отвечает. Правда, совсем не так, как запрограммировано в запросе:

HTTP/1.1 200 OK
Date: Fri, 14 Apr 2017 07:21:34 GMT
Server: Apache/***
X-Powered-By: PHP/***
Content-Length: 78
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=windows-1251

Несмотря на код ответа «200 ОК», никакого ответа «по существу» сервер не дает. Правильно, потому что политика CORS – не включена.

Как быть? Можно, конечно, не думая, подключить ее. Но, это хоть немного, но ослабит защищенность сайта. Поэтому целесообразно использовать иной вариант решения проблемы.

Выбор надлежащего адреса (с WWW или без него)

Гораздо правильнее, в данном случае, будет – перед отправкой запроса выбрать, куда его посылать: с использованием поддомена WWW или без него.

Перед отправкой запроса AJAX необходимо вначале создать объект XMLHttpRequest(). После чего выполнить

xhr.open("POST", 'http://site.ru/***.php', true);

Но, так не сработает, если загружена страница с поддоменом WWW, т.е. страница вида

http://www.site.ru/page.html

А ведь мы не знаем, в каком виде откроет эту страницу пользователь. Это зависит от того, по какой ссылке он на нее перейдет. А ссылки могут как содержать поддомен WWW, так и не содержать его.

Так вот, в качестве адреса программы – обработчика запроса, расположенной на сервере, указать адрес открытой в браузере страницы, то проблема исчезнет. Адрес можно определить средствами javascript:

var docum_location = window.location.protocol+"//"+document.location.hostname;

В эту переменную будет записан протокол (например, http:), по которому в браузере открыта страница, а также наименование хоста (например, www.site.ru или site.ru).

Соответственно, для открытия объекта XMLHttpRequest() следует написать:

xhr.open("POST", docum_location +'/***.php', true);

Таким образом, страница сама автоматически определит, с поддоменом WWW она открыта или без него. Также она определит используемый протокол. И, уже в зависимости от этого, сформирует правильный запрос.

Т.е. если страница была открыта с поддомена WWW (а узнать об этом можно, посмотрев в адресную строку браузера: если слева имеются эти три буквы, значит, страница действительно открыта с этого поддомена), то и запрос на сервер она будет адресовать на этот же поддомен. Если же без поддомена – соответственно, адрес запроса не будет содержать его.

Серверу же «все равно»: он примет запрос в обоих случаях.

А, может, сделать серверный редирект?

Можно сделать также серверный редирект запросов на один домен. Т.е. вне зависимости от того, куда были направлены запросы – на адрес с использованием поддомена WWW или без него, сервер будет их перенаправлять в одно место, допустим, на адрес без WWW. В данном случае, однако, это не поможет: ведь браузер не знает об этом. Браузер просто направляет запрос, а уж куда его перенаправляет сервер – это его уже не касается. Поэтому, скорее всего, указанная проблема не исчезнет. Тогда как определение адреса страницы и направление запроса на сервер с использованием полученного адреса позволит обойтись без ошибки и, соответственно, не потребуется включать политику CORS.

Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация