将charge.js移至src目录后,PHP调用外部JS文件失效问题
核心问题
Apache把public/设为根目录,意味着浏览器只能访问public目录下的文件,src/目录不在浏览器的可访问范围内,所以直接尝试引用src/js/charge.js的写法必然失败——浏览器根本找不到这个文件。
为什么之前的写法无效
PHP
require('js/charge.js'):
这是在服务器端读取src/js/charge.js的内容并直接输出到HTML中,但输出内容没有被<script>标签包裹,浏览器会把它当作普通文本而非可执行JS代码,自然不会运行。即使手动包裹标签,这种方式也没必要,且若JS包含PHP语法字符(比如<?)还会引发解析错误。<script src="js/charge.js">:
浏览器会根据当前页面URL(比如http://yourdomain/register.php)请求http://yourdomain/js/charge.js,这个路径指向public/js/charge.js而非你期望的src/js/charge.js,会返回404错误,JS无法加载。
解决方案
方案1:将charge.js移回public/js/(推荐)
前端JS代码本身就是要暴露给浏览器的,不存在"安全问题"——用户可通过浏览器开发者工具查看任何前端JS代码。如果charge.js包含敏感逻辑(比如收费计算核心规则),这类逻辑应该放在服务器端PHP代码里处理,而非前端JS中。
移回后,在src/register.php末尾添加:
<script src="/js/charge.js"></script>
这个绝对路径会让浏览器直接请求public/js/charge.js,和之前正常工作的写法一致。
方案2:通过PHP代理访问src/js/charge.js(仅当必须保留在src/时使用)
如果一定要把charge.js放在src/目录下,可在public/目录创建代理文件(比如public/js/charge-proxy.php),用来读取src/js/charge.js内容并输出给浏览器:
<?php // public/js/charge-proxy.php header('Content-Type: application/javascript'); readfile(__DIR__ . '/../../src/js/charge.js'); exit; ?>
然后在src/register.php中引用这个代理文件:
<script src="/js/charge-proxy.php"></script>
浏览器会请求代理文件,服务器端读取src/js/charge.js内容并以JS形式返回。
内容的提问来源于stack exchange,提问作者Victoria Stuart

