Наконец пришло время применить 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, и у меня есть несколько вопросов по этому поводу, по которым я не могу найти ясности:
Чтобы немного упростить тестирование, я сделал несколько экземпляров почти одного и того же кода в файлах с одинаковыми именами в разных каталогах и немного изменил содержимое, чтобы я мог легко определить, какое местоположение сработало с каким типом вызова, все это время глядя на логи 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
Сначала кое-что, что я заметил из вашего вопроса:
Флаги выполнения файловой системы не имеют значения в клиентских скриптах.
В этом фрагменте:
<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, а не сервер.