Laragon下.htaccess URL重写自定义域名可用,localhost路径不可用
问题原因及解决方案
核心问题分析
两种访问场景的路径差异导致了故障:
- 自定义域名(
myproject.test)下,项目处于服务器根目录,请求URI为/login,与路由数组的规则匹配,因此正常工作。 localhost/myproject/login下,项目处于服务器子目录,请求URI为/myproject/login,但你的路由数组仅匹配/login;同时.htaccess中的绝对路径/index.php会指向服务器根目录的文件,而非项目目录下的入口文件,双重问题导致路由失效。
修复步骤
1. 修改.htaccess,适配子目录的路径指向
将RewriteRule中的绝对路径改为相对路径,确保子目录下能正确指向项目的index.php:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 用相对路径替代绝对路径,兼容根目录和子目录场景 RewriteRule ^(.*)$ index.php?path=$1 [NC,L,QSA]
2. 修改router.php,统一路由匹配逻辑
通过动态获取项目的基础路径,自动去除URI中的子目录前缀,让路由规则在两种场景下都能生效:
<?php // 获取项目的基础路径(根目录下为/,子目录下为/myproject/) $basePath = dirname($_SERVER['SCRIPT_NAME']); $uri = parse_url($_SERVER['REQUEST_URI'])['path'] ?? '/'; // 去除URI中的子目录前缀,统一为/login这类格式 if ($basePath !== '/') { $uri = preg_replace('#^' . preg_quote($basePath, '#') . '#', '', $uri); // 处理去除前缀后为空的情况,默认指向首页 if ($uri === '') { $uri = '/'; } } $routes = [ '/' => 'pages/home.php', // 可选:添加首页路由规则 '/login' => 'pages/login.php', ]; if (array_key_exists($uri, $routes)) { require $routes[$uri]; } else { http_response_code(404); require "pages/errors/404.php"; return 0; }
额外验证项
- 确认Laragon的Apache已启用
mod_rewrite(你已完成此操作,可跳过) - 确认Laragon的Apache配置中,项目目录对应的
AllowOverride All已生效,确保.htaccess规则能被读取执行
内容的提问来源于stack exchange,提问作者Henrique Rodrigues
相关产品推荐
相关产品推荐

