终于到了将 JavaScript 应用到特定网站的时候了,所以我在测试子目录中编写了一些可以正常工作的代码,但是当我将其部署到网站时,我遇到了问题。当我尝试使用不在目录或调用它的页面所在的子目录中的脚本文件时,问题似乎是唯一的。这将是一个阻碍,因为站点范围内需要新功能,并且目录结构会根据我们不需要进入的其他机制动态更改;调用顶级脚本的能力至关重要。
因此,我将其全部剥离为两行非常简单的 JavaScript 来帮助阐明问题;当它包含在调用 html 所在目录中的文件中时,它可以工作,或者从那里的子目录,或者如果我通过指向另一个位置的链接在同一目录中引用它,那也很好。但是,如果我尝试以任何其他方式引用脚本文件,则会失败:
[Thu Dec 08 12:08:26.643037 2016] [cgi:error] [pid 27403] [client xx.xx.xx.xx:46247] AH01215: (8)Exec 格式错误:'/usr/www/http 的 exec /js/test.js' 失败,引用者:http ://example.com/test/jstest.html [Thu Dec 08 12:08:26.643548 2016] [cgi:error] [pid 27403] [client xx.xx. xx.xx:46247] 标头之前的脚本输出结束:test.js,引用:http ://example.com/test/jstest.html
当然,这里 xx.xx.xx.xx 是服务器的 IP,“example.com”是有问题的域,路径 '/usr/www/http' 是 Apache 服务于该域的顶级目录网站来自。
我已经阅读了很多关于这方面的材料,我知道 Apache 配置文件很重要......我尝试设置 ScriptAlias 并且有一些关于它的问题,我似乎无法弄清楚:
- 究竟如何在 HTML 代码中引用“ScriptAlias”目录中的脚本 - 以斜杠开头?是否有一些特殊字符可以说“站点顶部”?和;
- 整个站点是否只允许一个唯一的 ScriptAlias 目录,或者一个可以有多个要搜索的目录 - 如果是这样,您如何指定它们、ScriptAlias 的多个定义、逗号分隔列表等?和;
- 我们可以为每个 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
目的。您不能将客户端 JavaScript 文件放在ScriptAlias
指令中也有描述的目录中。ScriptAlias
是一个 Apache 配置指令,告诉它尝试将该目录中的文件作为程序执行并返回程序的输出,而不是简单地将静态文件传输到用户代理。这显然不是你想要的。应该运行 JavaScript的是浏览器,而不是服务器。首先,我从您的问题中注意到了一些事情:
文件系统执行标志在客户端脚本上无关紧要
在这个片段中:
<script src="/usr/WWW/http/js/test.js></script>
在我看来,你已经把完整的文件系统路径放在那里,你应该使用 URI 路径,注意区别。读取为 URI 路径,假设脚本可以从以下位置下载:
实际上,从我从您的日志中看到的情况是,Apache 正在尝试将 javascript 传递给 CGI 进程并失败了,实际上它是一个客户端脚本:
因此,首先将您的 javascripts 放在 ScriptAlias 路径之外。当我们这样做时,您可以在您的
tree
文档根目录上运行一个,您可以忽略文件,只需将 html 文件从您包含您的 javascript 和 javascript 本身的位置保留下来,这样我们就可以获得更好的图片。树输出后更新
假设正在加载 javascript 的 html 页面是文档根目录中的 index.html,那么加载第一个 javascript 的正确方法
$DOC_ROOT/js/test.js
是:如果要加载第二个,即“测试”树下的那个:
也就是说,文件系统 路径
$DOCUMENT_ROOT
被翻译成_URI路径'/',或者http(s)://example.com/如果事情不起作用,请检查您的日志。如果您收到上述 AH01215 错误,请再次检查您的 ScriptAlias 设置(我知道您这样做了,但该错误与此有关)