如何通过.htaccess重写PHP MVC项目路由以隐藏index.php参数前缀
问题修复方案
现有配置问题排查
- 正则表达式语法错误:字符集
[a-zAZ0-9]缺少A-Z的范围连接符,正确应为[a-zA-Z0-9],且当前规则无法匹配带斜杠的多级路由(如storefront/detail) - 未指定重写入口文件:规则仅写了
?ruta=$1没有关联到入口index.php,服务器无法将请求转发到PHP处理 - 缺少子目录适配:你的项目部署在
/realestate/web/子目录下,未配置RewriteBase会导致重写路径匹配到站点根目录,规则不生效 - 注意参数拼写一致性:你问题里提到的原路由参数是
route,但PHP和重写规则里用的是ruta,需要确保前后一致
修复后的.htaccess配置
将该文件放在/realestate/web/目录下,内容如下:
RewriteEngine On # 指定项目基础路径 RewriteBase /realestate/web/ # 跳过真实存在的文件和目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 重写所有请求到index.php,传递ruta参数 # L标记表示匹配成功后不再执行后续规则,QSA标记用于保留原有GET参数 RewriteRule ^(.*)$ index.php?ruta=$1 [L,QSA]
PHP代码优化修复
你现有404输出的HTML语法存在错误,同时建议添加XSS防护,修复后的对应片段:
//404 header('HTTP/1.1 404 Not Found'); echo '<html><body><p style="color:red"><b>ERROR: No existe la ruta '. htmlspecialchars($_GET['ruta']) . '</b></p></body></html>'; exit;
生效验证步骤
- 确认Apache的
mod_rewrite扩展已经开启 - 确认Apache站点配置中,
/realestate/web/目录的AllowOverride参数设置为All,允许.htaccess文件生效 - 直接访问
http://localhost/realestate/web/storefront即可正常匹配路由,访问根路径http://localhost/realestate/web/会默认走home路由
内容的提问来源于stack exchange,提问作者Antonio Rodríguez
相关产品推荐
相关产品推荐

