Решение проблемы Drupal "HTTP запрос AJAX завершен неправильно."

 

Эта ошибка встречалась мне на разных хостингах. В основном, когда я пользовался полем тегов с автозаполнением через AJAX. Ошибку было трудно повторить, и я предполагал, что Drupal'у просто нужно больше памяти.

 

Но когда всё же стал разбираться, в чем тут дело, то выяснил: проблема в настройке Drupal.

 

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

 

Причины

 

Итак, эта ошибка возникает, когда текущая страница браузера пытается выполнить так называемый Cross-domain запрос. Проще говоря, в браузере открыта страница http://technerium.ru, а запрос идет на какой-либо субдомен этого сайта, например, http://subdomain.technerium.ru. И наоборот, если мы со страницы субдомена пытаемся выполнить запрос на домен или другой субдомен.

 

Вы можете удивиться: "но на моем сайте нет никаких субдоменов!". Вы и правы и нет: субдомен это не только http://subdomen.technerium.ru, но и... http://www.technerium.ru.

 

Как так получается, что у нас открыта, например, страница без www, а запрос идет на сайт с www? Дело в двух настройках друпала.

 

1. Переменная base_url в файле настроек sites/default/settings.php. По умолчанию она не задана, но если вы, к примеру, настраивали CKEditor на Drupal, то вам пришлось ее задать в явном виде, допустим, вот так:


$base_url = 'http://www.technerium.ru';  // NO trailing slash!

 

То есть друпал теперь считает "своим" домен с www.

 

2. Директива RewriteCond %{HTTP_HOST} в файле .htaccess. В файле есть довольно полный комметарий на английском по настройке этой директивы. Если кратко, то эта настройка регулирует, куда сервер будет перенаправлять запросы: на домен с www или без.

 

Эти строки включают перенаправление на домен без www:

 

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

 

А эти на домен с www:


RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

 

Как возникает ошибка? Скажем, у вас base_url с www. А в .htaccess директива не задана (по умолчанию так и есть, там всё закомментировано). Тогда перенаправление не работает. И если вы открываете сайт, используя домен без www, то страница-то откроется, но все запросы с нее будут идти на домен без www. И возникнет ошибка.

 

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

 

После объяснения почему возникает ошибка, уже наверное пора рассказать, как ее исправить.

 

Решение

 

Проверьте, какое значение задано в качестве переменной base_url в файле sites/default/settings.php. Если ничего не задано, строка вообще закомментирована, то задайте, например, с www:


$base_url = 'http://www.technerium.ru';  // NO trailing slash!

 

Включите соответствующую директиву в файле .htaccess:

 

если base_url с www:

 

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

 

если же base_url не содержит www, то эту

 

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

 

Убедитесь, что включена (незакомментирована)  только одна директива!

 

Мне помогло. Надеюсь, поможет и вам. Успеха!

 

 

 

 

Категория: 
Была ли статья полезна: 

Комментарии

Мне такой способ не помог, ошибка похоже, но, видимо, не та.

Приветствую

А вы ошибку опишите конкретнее, пожалуйста.