使用.htaccess简化URL结构引发无限重定向问题求助
解决.htaccess无限重定向问题,实现URL简化
我之前也踩过这个一模一样的坑!无限重定向的核心原因几乎都是重写规则没区分真实存在的文件/目录和虚拟请求,导致服务器不断把index.php自身的请求也转发回index.php,形成死循环。咱们结合你的项目场景一步步解决:
第一步:放置正确的.htaccess文件
把这个配置文件放在你的项目根目录(也就是example.com/example/scrambling/目录下):
# 开启URL重写引擎 RewriteEngine On # 设定重写的基础路径(必须严格匹配你的子目录结构) RewriteBase /example/scrambling/ # 排除真实存在的文件(比如css、js、图片等静态资源,避免被重写) RewriteCond %{REQUEST_FILENAME} !-f # 排除真实存在的目录(避免重写真实目录的请求) RewriteCond %{REQUEST_FILENAME} !-d # 把所有符合条件的请求转发到index.php,同时传递请求路径作为参数 RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
第二步:在index.php中处理请求参数
现在用户访问example.com/example/scrambling/api时,请求会被转发到index.php,你可以通过$_GET['page']拿到api这个值,进而加载对应的页面文件:
<?php // 获取页面参数,默认可设为首页(比如'home') $page = $_GET['page'] ?? 'home'; // 拼接页面文件路径 $pagePath = __DIR__ . '/pages/' . $page . '.htm'; // 检查页面是否存在,存在则加载,否则返回404 if (file_exists($pagePath)) { include $pagePath; } else { http_response_code(404); echo "页面不存在"; } ?>
关键规则解释
- RewriteBase:这个是子目录下重写的核心,必须完全匹配你的项目子路径,否则重写后的请求会找不到
index.php,是最容易踩的坑。 - !-f 和 !-d:这两个条件是阻止无限重定向的关键——它们告诉服务器:如果请求的是真实存在的文件或目录,就跳过重写规则。这样
index.php作为真实文件,就不会被重复转发了。 - [L,QSA]:
L表示这是最后一条规则,匹配到就停止后续处理;QSA表示保留原请求的查询参数(比如用户访问/api?id=1时,id=1会被保留到index.php的参数里)。
常见问题排查
如果还是出现问题,可以检查:
- Apache服务器是否开启了
mod_rewrite模块(这是URL重写的前提) - .htaccess文件的权限是否正确(需要确保服务器能读取该文件)
- RewriteBase的路径是否完全匹配(不能多斜杠或少斜杠)
内容的提问来源于stack exchange,提问作者GrumpyCrouton
相关产品推荐
相关产品推荐

