Ubuntu 16.04 / Apache / 如何修复对 javascript 文件夹的访问

如果在 Ubuntu 的 Apache 上访问 /javascript/ 时出现 403 禁止访问错误,请检查 javascript-common 包创建的 Apache 别名是否与站点路径冲突。然而,403 错误也可能由于权限或目录列表设置引起,因此在采取操作之前,应一起检查实际文件响应和服务器设置。

首先要检查的事项

本文基于在 Ubuntu 上使用 Apache 2.4 的环境。原文涉及 Ubuntu 16.04 LTS,这是一个老版本,其标准支持和一般的 Ubuntu Pro 支持已结束。请确认额外旧版本支持的条件,并计划迁移到受支持的版本。支持计划可以在 Ubuntu 安全维护计划 查看。

在浏览器中仅打开 /javascript/ 文件夹地址时看到 403 错误,以及无法加载其内部 JavaScript 文件,是不同的问题。如果目录中没有默认索引文件且目录列表被关闭,则文件夹地址可能会返回 403,但单个文件仍然可以正常提供。

在浏览器开发者工具的网络(Network)选项卡中,检查实际失败的文件的 URL 和状态码。例如,检查站点引用的 /javascript/app.js 是否返回 200、403 或 404,同时检查响应内容。即使显示 200,返回的内容也可能不是预期的 JavaScript 文件。

什么是别名冲突?

在某些 Ubuntu 和 Debian 环境中,活动的 javascript-common 配置可能包含如下别名。当应用此配置时,URL 路径 /javascript 可能指向站点文档根目录下以外的目录。

Alias /javascript /usr/share/javascript/

例如,如果 Apache 在 /usr/share/javascript/ 下查找请求的 /javascript/app.js,原始站点文件夹中的文件可能无法提供服务。如果目标文件不存在,可能会出现 404 错误;如果访问目标被拒绝或不允许目录列表,可能会出现 403 错误。不要仅根据状态码就断定别名存在冲突。

此别名与 URL 的第一个路径段为 /javascript 的请求相关。并非其他路径段下的所有 javascript 文件夹,例如 /assets/javascript/app.js,都会自动匹配该别名。实际的映射和优先级可能会因虚拟主机、其他别名、重定向和重写规则而有所不同。您可以在 Apache 别名文档 中检查路径匹配和处理顺序。

检查活动设置和错误日志

连接到服务器以验证 Apache 版本和虚拟主机。以下搜索将在配置目录中找到相关字符串,未使用的设置也可能出现在结果中。

apache2 -v
sudo apache2ctl -S
sudo grep -R -n -i javascript /etc/apache2

如果 /etc/apache2/conf-available/javascript-common.conf 出现在结果中,请检查其内容并验证它是否已实际激活并链接到 /etc/apache2/conf-enabled/。同时,审查虚拟主机特定设置和其他 URL 规则。如果文件缺失或别名被禁用,不要假设该设置是原因。

ls -l /etc/apache2/conf-enabled/javascript-common.conf
sudo cat /etc/apache2/conf-available/javascript-common.conf

如果收到文件或符号链接不存在的消息,则安装或活动状态不同。检查请求时的 Apache 错误日志以查看实际路径和发现的错误。在 Ubuntu 的默认配置中,/var/log/apache2/error.log 可能可用,但每个虚拟主机的日志路径可能不同。

sudo tail -n 50 /var/log/apache2/error.log

选择解决方法

如果可以在网站上更改文件路径,请使用类似 /assets/js/ 的路径,该路径不与别名重叠,同时修改 HTML script 地址和构建设置。如果已有页面、缓存或外部链接使用现有地址,请检查更改的影响,并在部署后请求实际文件。仅仅重命名文件夹而保持引用不变,将导致现有页面无法找到该文件。

如果您需要保留现有的 /javascript 地址,服务器管理员可以在更改或禁用别名之前查看所有虚拟主机和软件包的依赖关系。禁用 javascript-common 设置也可能会更改其他站点或软件包使用的地址,因此首先需要调查影响并准备恢复措施。直接编辑软件包配置文件可能会在软件包更新时使管理变得更加复杂。

当您已确认该设置已启用且未被其他服务使用时,以下是可选项。此命令可能影响服务器的整个 Apache 配置。如果执行后语法检查失败,请不要重新加载;首先解决原因或重新启用配置。

sudo a2disconf javascript-common
sudo apache2ctl configtest

只有在语法检查确认 Syntax OK 时才重新加载配置。服务名称可能会根据环境而有所不同。

sudo systemctl reload apache2

要恢复,请使用以下命令重新激活设置,并且仅在语法检查成功时才重新加载。

sudo a2enconf javascript-common
sudo apache2ctl configtest && sudo systemctl reload apache2

在更改和其他原因后进行检查

再次请求更改前失败的确切文件 URL,并检查状态码和文件内容。清除浏览器缓存或将开发工具设置为不使用缓存,然后检查页面上的网络请求和控制台错误。同时,检查使用现有 /javascript 路径的其他网站或包。

如果别名不是原因,或者更改后仍然出现403错误,请检查Apache的Directory·Location访问规则、文件读取权限和父目录访问权限、符号链接设置,以及默认索引文件和目录列表策略。不要为了消除错误而随意允许所有访问或启用目录列表,因为这可能会暴露您不打算公开的文件;相反,应首先验证实际所需的文件和策略。