Назад | Перейти на главную страницу

JavaScript «AH01215: (8) Ошибка формата Exec» «Конец вывода скрипта перед заголовками» в Apache

Наконец пришло время применить JavaScript к конкретному веб-сайту, поэтому я написал код, который отлично работает в тестовом подкаталоге, но когда я пошел развертывать его на веб-сайт, я столкнулся с проблемой (-ами). Проблема (ы), кажется, уникальна, когда я пытаюсь использовать файл сценария, который не находится в каталоге или подкаталоге, где находится вызывающая его страница. И это было бы препятствием, потому что новая функциональность необходима для всего сайта, а структура каталогов динамически изменяется в зависимости от других механизмов, которые нам здесь не нужны; возможность вызвать сценарий верхнего уровня жизненно важна.

Итак, я сократил все это до двух строк очень простого JavaScript, чтобы помочь пролить свет на проблемы; когда он содержится в файле в каталоге, в котором находится вызывающий html, он работает, или в подкаталоге оттуда, ИЛИ если я обращаюсь к нему в том же каталоге через ссылку на другое место, это тоже нормально. Но если я попытаюсь обратиться к файлу сценария каким-либо другим способом, это не удастся:

[Чт, 08 декабря, 12: 08: 26.643037 2016] [cgi: error] [pid 27403] [client xx.xx.xx.xx: 46247] AH01215: (8) Ошибка формата Exec: exec of '/ usr / www / http /js/test.js не удалось, референт: http://example.com/test/jstest.html [Чт, 08 декабря, 12:08: 26.643548 2016] [cgi: error] [pid 27403] [client xx.xx.xx.xx: 46247] Конец вывода сценария перед заголовками: test.js, referer: http://example.com/test/jstest.html

Здесь, конечно, xx.xx.xx.xx - это IP-адрес сервера, example.com - это рассматриваемый домен, а путь '/ usr / www / http' - это каталог верхнего уровня, который Apache обслуживает для этого домена веб-сайт из.

Я прочитал много материалов по этому поводу и знаю, что файлы конфигурации Apache имеют значение ... Я попытался установить ScriptAlias, и у меня есть несколько вопросов по этому поводу, по которым я не могу найти ясности:

  1. Как скрипты в каталоге "ScriptAlias" упоминаются в HTML-коде - начинаются с косой черты? Есть ли какой-нибудь специальный символ, чтобы сказать «вверху сайта»? И;
  2. Существует ли только один уникальный каталог ScriptAlias, разрешенный для всего сайта, или можно иметь несколько каталогов, в которых выполняется поиск - и если да, то как их указать, несколько определений ScriptAlias, список, разделенный запятыми, и т. Д.? И;
  3. Можно ли установить по одному для каждого VirtualHost? И делаем ли мы это, помещая ScriptAlias ​​в определение виртуального хоста?

Чтобы немного упростить тестирование, я сделал несколько экземпляров почти одного и того же кода в файлах с одинаковыми именами в разных каталогах и немного изменил содержимое, чтобы я мог легко определить, какое местоположение сработало с каким типом вызова, все это время глядя на логи Apache. Вот пример одного из этих файлов:

var myHeading = document.querySelector('h2');
myHeading.textContent = 'website top level js dir';

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

В HTML любая ссылка, подобная любой из них, работала до тех пор, пока вызывающая страница находилась либо в том же каталоге, что и test.js, либо в родительском каталоге, либо если была ссылка на test.js, которая была либо в том же каталоге, либо подкаталог:

<script src="test.js"></script>
<script src="js/test.js"></script>
<script src="http://example.com/test/js/test.js"></script>

В HTML любая подобная ссылка всегда терпела неудачу, что бы я ни пытался, пока вызывающий html не находился в том же каталоге или родительском каталоге:

<script src="/js/test.js"></script>
<script src="/usr/WWW/http/js/test.js></script>
<script src="http://example.com/test/js/test.js"></script>

Все задействованные каталоги и файлы принадлежат моим личным UID и GID (как всегда), и все их права доступа равны 755.

Существует глобальный ScriptAlias, определенный как (также пробовали варианты этого):

ScriptAlias /js/ "/usr/www/js/"

В определении виртуального хоста есть еще одна запись ScriptAlias ​​- не знаю, делает ли она что-нибудь! Насколько я могу судить, эффекта пока нет. ... И в главном файле конфигурации для всех каталогов, которые я пробовал, есть такие записи в каталоге:

<Directory /usr/www/http/js/>
   AllowOverride None
   Options ExecCGI
   Require all granted
</Directory>

ОБНОВИТЬ Фреди хотел дерево. Хорошо:

Дерево начинается в корне документа виртуального хоста - кому какое дело? Оттуда:

├── index.html
├── js
│   └── test.js
└── test
    ├── js
    │   └── test.js
    └── testjs.html

3 directories, 4 files

Сначала кое-что, что я заметил из вашего вопроса:

  • ScriptAlias ​​не имеет ничего общего со сценариями на стороне клиента, он предназначен для сценариев на стороне сервера / CGI.
  • Флаги выполнения файловой системы не имеют значения в клиентских скриптах.

  • В этом фрагменте:

<script src="/usr/WWW/http/js/test.js></script>

Мне кажется, вы указали полный путь к файловой системе, вместо этого вы должны использовать пути URI, остерегайтесь разницы. Считается как путь URI, предполагается, что сценарий можно загрузить с:

http(s)://example.com/usr/WWW/http/js/test.js

На самом деле из того, что я вижу из ваших журналов, происходит то, что Apache пытается передать javascript процессу CGI и терпит неудачу, действительно, это скрипт на стороне клиента:

[Чт, 08 декабря, 12: 08: 26.643037 2016] [cgi: error] [pid 27403] [client xx.xx.xx.xx: 46247] AH01215: (8) Ошибка формата Exec: exec of '/ usr / www / http /js/test.js не удалось, референт: http://example.com/test/jstest.html [Чт, 08 декабря, 12:08: 26.643548 2016] [cgi: error] [pid 27403] [client xx.xx.xx.xx: 46247] Конец вывода сценария перед заголовками: test.js, referer: http://example.com/test/jstest.html

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

Обновление после вывода дерева

Предполагая, что html-страница, загружающая javascript, это index.html в корне документа, правильный способ загрузки первого javascript, находящегося под $DOC_ROOT/js/test.js является:

<script src="/js/test.js"></script>

Если вы хотите загрузить второй, тот, что находится под "тестовым" деревом:

<script src="/test/js/test.js"></script>

Это файловая система дорожка $DOCUMENT_ROOT переводится в _URI дорожка '/' или http (s): //example.com/

Если что-то не работает, проверьте свои журналы. Если вы получили ошибку AH01215, как указано выше, проверьте еще раз свои настройки ScriptAlias ​​(я знаю, что вы это сделали, но эта ошибка связана с этим)

Это не то ScriptAlias предназначен для. Вы не можете поместить файлы клиентского JavaScript в каталог, который также описан в ScriptAlias директива.

ScriptAlias - это директива конфигурации Apache, сообщающая ему, что он должен попытаться выполнить файлы в этом каталоге как программы и вернуть вывод программ вместо простой передачи статического файла пользовательскому агенту. Совершенно очевидно, что это не то, что вам нужно. Это браузер который должен запускать JavaScript, а не сервер.