DigitalOcean环境下Apache2子目录页面刷新返回404错误求助
问题根因
能正常跳转访问子路径、刷新就触发404,是典型的单页应用路由适配问题。这类应用的前端路由由浏览器端实现,服务器磁盘上并不存在/foo/bar对应的实际文件。当前的Apache默认配置没有配置请求重写逻辑,遇到不存在的文件路径就直接抛出404,不会把这类请求转发到应用的入口HTML文件。
修复步骤
- 启用Apache重写模块,执行命令:
sudo a2enmod rewrite - 编辑站点配置文件
/etc/apache2/sites-available/000-default.conf,替换原有内容为如下完整配置:
这种把重写规则直接写在Vhost配置块的方式,比依赖目录下的<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html <Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride None Require all granted # 核心重写逻辑 RewriteEngine On # 不拦截实际存在的文件、目录请求 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 所有匹配上述条件的请求,统一转发到应用入口 RewriteRule ^(.*)$ /index.html [L] </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>.htaccess文件稳定性更高,也不需要放开AllowOverride All带来的额外安全风险。 - 校验配置语法:
执行sudo apache2ctl configtest,终端返回Syntax OK即表示配置无语法问题,否则根据提示的行号修正配置错误。 - 重启Apache让配置生效:
sudo systemctl restart apache2
注意事项
- 如果Web应用没有部署在域名根路径,而是挂在类似
example.com/myapp/的子路径下,需要把重写跳转的目标路径对应调整为/myapp/index.html,避免路由定位错位。 - 如果应用的入口文件不是默认的
index.html,把重写规则里的目标路径改成对应的入口文件名即可。 - 配置生效后如果仍有404问题,直接查看
/var/log/apache2/error.log的最新报错,通常是目录读权限不足、规则路径不匹配导致的。
内容的提问来源于stack exchange,提问作者smul.hn
相关产品推荐
相关产品推荐

