Ubuntu20.04下PHP MVC系统Apache mod_rewrite重写不生效排查
对应问题的排查与解决思路
你遇到的「首页能正常加载、非首页路径全部404」的症状,刚好对应rewrite规则的分段失效:根目录下的.htaccess能正常把根路径请求转发到public目录下真实存在的index.php文件,但public目录下的路由规则完全没有生效,所有指向public目录下不存在的虚拟路径的请求都会直接被Apache抛出404。可以按照以下顺序逐项排查:
核心配置偏差排查
- 优先核对
public/.htaccess中硬编码的RewriteBase /criate/public与实际部署路径的匹配度
你当前站点访问入口是根域名https://api.aplication.com,如果该域名直接映射到项目的外层根目录(也就是包含根级.htaccess的MVC项目目录,路径类似/var/www/html/你的项目根),那public目录在站点内的实际路径根本不存在/criate/这层前缀,硬编码的RewriteBase会导致rewrite规则匹配的基准路径完全错位,直接将非首页的请求指向不存在的目录触发404。
验证方式:如果项目直接挂在域名根路径,将该值改为RewriteBase /public即可,同时核对代码内生成跳转链接时的硬编码路径,去掉多余的/criate前缀。 - 核对Apache全局与虚拟主机的配置生效优先级
虽然你给/var/www/html配置了AllowOverride All,但Ubuntu 20.04默认的Apache虚拟主机配置(/etc/apache2/sites-available/下对应api.aplication.com的配置文件)可能存在独立的<Directory>块,将项目实际部署路径的权限设置为AllowOverride None,导致.htaccess里的规则完全不被解析;同时检查是否有其他全局配置块,给项目路径额外设置了AllowOverride None的覆盖规则。
验证方式:执行apache2ctl -S查看当前激活的虚拟主机配置,找到api.aplication.com对应的配置文件,确认其内部对项目部署路径的Directory规则和你配置的权限一致。 - 排查mod_negotiation(Multiviews)的规则冲突
即使你在public/.htaccess里写了Options -Multiviews,如果Apache的全局配置中对public目录的Options设置强制覆盖了.htaccess的配置,mod_negotiation模块会优先拦截不存在的路径请求,尝试自动匹配同前缀的静态文件/目录,找不到对应资源时会直接抛出404,根本不会执行后续的rewrite规则把请求转发到index.php。
验证方式:确认项目实际部署路径下的Directory配置中,Options行不包含Multiviews参数。
文件与权限排查
- 检查public目录下的
.htaccess文件的读取权限
跨平台拷贝文件时可能丢失Linux下的文件所有权与读取权限,根目录的.htaccess权限正常所以首页的重定向能生效,但public目录下的.htaccess因为权限不足(比如文件所有者是本地普通用户,权限为600,运行Apache的www-data用户无读取权限),导致路由规则没有被加载,所有不存在的public下的子路径都会直接触发404。
验证方式:将项目所有文件的所有者设置为www-data:www-data,给所有.htaccess文件设置644的读取权限,确认Apache进程可以正常读取public目录下的规则文件。
规则有效性调试
- 临时开启rewrite规则的调试日志定位问题
在对应虚拟主机的配置文件中添加规则LogLevel rewrite:trace3,重启Apache后触发一次404的登录请求,查看Apache的error.log日志,确认rewrite规则是否被加载、每条规则匹配时实际计算的路径值是多少,直接定位规则不生效的断点。
日志确认规则正常后记得把调试日志级别调回默认值,避免影响服务器性能。
内容的提问来源于stack exchange,提问作者Daniel Drummond
相关产品推荐
相关产品推荐

