0

首先:我不是在谈论每个执行的位置,而是浏览器协议的不同之处在于从服务器获取脚本(或者,我真的不知道)。

我看到一个非常奇怪的行为,我无法解释,在互联网上搜索了几天后我找不到原因。

情况如下:我有一些最初存储在 .php 文件中的 javscript,因为在获取脚本时需要执行一些服务器端魔法。浏览器这样调用它:

<script language="JavaScript" type="text/javascript" src="http://myserver.com/script.php"></script>

javascript 本身在加载时会进行一些 AJAX 调用。在由 AJAX 调用激活的 (PHP) 脚本中,我有一个计数器来跟踪流量。

现在在某个时候,script.php 完成的 php 魔法被删除了,我能够简单地将 .php 文件转换为 .js ,如下所示:

<script language="JavaScript" type="text/javascript" src="http://myserver.com/script.js"></script>

它具有完全相同的输出,并进行完全相同的 AJAX 调用。

这是奇怪的部分:使用 script.js,我的计数器说有 1/10 的流量来自 script.php。我不知道为什么会这样......

我检查了服务器的 access.log,确实,script.js 收到的请求比 script.php 少得多。当我恢复到 script.php 时,流量立即增加到 10/10。

我在调试中遇到的主要问题是我无法重现未加载的脚本。我总是在让脚本加载/执行的那 10% 中。

我试图不让 script.js 缓存,但这没有帮助。我还尝试观察这种行为是否与浏览器无关,但对我来说,它适用于 FF、Chrome 和 IE。此外,访问日志中的用户代理字符串对于判断它实际上是哪个浏览器并不是很有帮助。

如果有人能对此有所启发,我将非常感激。

[编辑] 即使 js 脚本来自缓存,这很好,因为它节省了我大量的流量,它不应该仍然执行并进行 AJAX 调用吗?这也不会发生(因此只有 1/10 的流量,如计数器所示)

[EDIT2] 我刚刚注意到 script.php 有 Content-Type: application/javascript 而 script.js 有 Content-Type: application/x-javascript 现在我不知道这是否可能导致这种行为,但我'我会尝试改变它。更改它,并更改 script.js 以及换行符,因此它需要刷新并没有帮助......

4

2 回答 2

1

如果无法查看请求跟踪,这是一个很难回答的问题。奇怪的是,您的 Web 服务器不会为一个和另一个发出相同的缓存标头。

当您调用 PHP 脚本时,HTTP 响应由 PHP 本身生成,除非明确完成,否则不会发出缓存标头。相反,当您加载 JS 文件或任何静态文件时,它将直接由您的 HTTP 服务器 (Apache/nginx/...) 提供服务,并且Web 服务器将发出诸如Date/If-Modified-Since或标头之类的标头以简化Etag加载并避免对同一版本的文件进行多次提取。

您可能需要查看这些标题以确保这是正在发生的事情。

每次都加载脚本的一个常见技巧(我不确定这是您需要的)是在 URL 上附加一个随机参数,如下所示:

<script language="JavaScript" type="text/javascript" src="http://myserver.com/script.js?r=<?= rand() ?>"></script>
于 2013-07-09T10:32:11.507 回答
0

这很可能是由于不同的缓存设置。浏览器在再次向服务器请求脚本之前将脚本保存在缓存中的时间由 HTTP 缓存标头决定。对于 PHP 脚本,Web 服务器可能配置为输出导致浏览器根本不缓存它并每次再次请求它的标头。对于 .js 文件,默认值可能会缓存一段时间,因为 .js 文件通常不会经常更改。

于 2013-07-09T10:27:18.210 回答