XAMPP中mod_rewrite重定向返回完整目录路径问题求助
解决方案
1. 先配置虚拟主机(核心修正)
把batulabe设为独立虚拟主机的文档根,解决路径解析混乱问题:
编辑你的website.conf,写入以下内容:
<VirtualHost *:80> ServerName batulabe.local DocumentRoot "/opt/lampp/htdocs/batulabe" <Directory "/opt/lampp/htdocs/batulabe"> AllowOverride All # 允许.htaccess生效 Require all granted Options -Indexes # 禁止目录浏览 </Directory> </VirtualHost>
修改Mac的/etc/hosts文件,添加一行:
127.0.0.1 batulabe.local
重启Apache后,访问http://batulabe.local就直接指向batulabe目录,无需再输入/batulabe。
2. 修正.htaccess重写规则
替换/opt/lampp/htdocs/batulabe/.htaccess内容为:
<IfModule mod_rewrite.c> RewriteEngine On # 仅当请求的不是真实文件/目录时执行重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将URL中的单路径段重写到真实PHP文件路径 RewriteRule ^([a-zA-Z0-9_-]+)$ public/pages/$1.php [L] </IfModule>
规则关键说明:
!-f/!-d:避免重写真实存在的文件或目录(比如静态资源、真实文件夹)- 去掉
R=301:我们需要的是内部重写(用户看到的URL不变,后台加载真实文件),外部重定向会暴露服务器本地路径 [L]:执行完这条规则后停止后续重写逻辑
3. 验证效果
访问http://batulabe.local/varpage,后台会自动加载public/pages/varpage.php,URL保持不变,不会暴露真实文件夹结构。
之前规则出错的原因
- 原规则
RewriteCond %{REQUEST_FILENAME} -f逻辑颠倒:你需要匹配的是不存在的请求路径,而非已存在的文件 R=301触发外部重定向,Apache会把相对路径解析为服务器物理路径的URL,导致暴露本地目录- 未正确设置DocumentRoot,导致Apache的路径匹配、替换逻辑混乱
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

