public为文档根时,index.php跳转上级welcome.php遇404问题求助
问题核心
web服务器把public设为文档根,意味着服务器只会对外暴露public目录内的文件,htdocs下的welcome.php属于文档根外的内容,不管用哪种路径写法重定向,服务器都找不到这个文件,所以返回404。之前的.htaccess规则会把所有不存在的请求转去index.php,加上index.php又重定向到不存在的welcome.php,直接形成无限循环,导致重定向次数过多。
解决办法
方法1:用入口文件转发(推荐,不用改结构)
保持现有目录结构,把index.php里的重定向逻辑改成直接加载welcome.php的内容,而不是跳转到它:
// index.php 核心代码 session_start(); // 假设用session判断认证状态 if (!isset($_SESSION['is_logged_in'])) { // 直接加载上级目录的welcome.php require_once '../welcome.php'; exit; // 加载完就终止脚本,别跑后面的认证逻辑 } // 已认证后的业务代码...
这种方式既保留了你的目录结构,用户也看不到真实的文件路径,安全性更高。
方法2:调整文件位置+修复.htaccess
如果一定要用重定向,把welcome.php移到public目录下,结构变成:
htdocs ├─ public │ ├─ index.php │ └─ welcome.php └─ 其他业务文件(比如控制器、模型)
然后修改index.php的重定向代码:
header("Location: /welcome.php"); exit;
同时把.htaccess规则改成这样,避免循环:
RewriteEngine On # 跳过已存在的文件和目录,只处理不存在的请求 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
这样既保证了业务文件在public外,也不会出现重定向循环。
方法3:服务器配置别名(需权限,不推荐)
如果你能改服务器配置(比如Apache的httpd.conf、Nginx的配置文件),可以给welcome.php设一个别名,让服务器通过特定URL能访问到它,但这种方式需要服务器权限,灵活性差,一般不推荐。
内容的提问来源于stack exchange,提问作者Rideron
相关产品推荐
相关产品推荐

