NameCheap部署PHP网站后非首页404错误求助
问题:NameCheap部署PHP网站后非首页出现404错误
我刚在NameCheap上部署了自行开发的PHP网站,首页访问正常,但访问其他页面时会出现404页面未找到错误(截图:
)。
我的.htaccess文件代码:
RewriteEngine On RewriteRule ^([^\.]+)$ $1.php [NC,L] RewriteRule ^([^\.]+)$ $1.html [NC,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/?$ index.php?url=$1 [L,QSA]
我的index.php文件代码:
<?php require_once __DIR__ . '/_core/config/init.php'; $query_string = 'url'; $_GET[$query_string] = isset($_GET[$query_string]) && !empty($_GET[$query_string]) ? $_GET[$query_string] : "home"; $url_array = explode("/", $_GET[$query_string]); foreach ($url_array as $key => $value) { $url_array[$key] = preg_replace('/.php/', "", $url_array[$key]); } $_page = isset($url_array[0]) && !empty($url_array[0]) ? $url_array[0] : "index"; $_section = isset($url_array[1]) && !empty($url_array[1]) ? $url_array[1] : "index"; $url_array_count = count($url_array); if ($url_array_count >= 3) { //error page include_once __DIR__ . "/assets/shared/404.php"; } if (in_array($_page, getPages())){ include_once(__DIR__ . '/includes/components/head.php'); include_once(__DIR__ . '/includes/pages/' . $_page . '.php'); die(); } $isLogin = isset($_SESSION['app_session']['cms']['is_login']) ? $_SESSION['app_session']['cms']['is_login'] : false; if($_page == 'controls'){ $cmsPg = getCMSPgName()[0]['sccPage']; if($isLogin ){ include_once(__DIR__ . '/includes/cmspages/'.$_page.'.php'); die(); }else{ include_once(__DIR__ . '/includes/cmspages/cmslogin.php'); die(); } }else{ if($isLogin ){ include_once(__DIR__ . '/includes/cmspages/'.$_page.'.php'); die(); }else{ include_once(__DIR__ . '/includes/cmspages/cmslogin.php'); die(); } } include_once(__DIR__ . '/includes/cmspages/contentmgr.php');
解决方法
1. 修正.htaccess规则逻辑
你的.htaccess前两条规则存在致命逻辑问题:
- 第一条规则会把所有不含
.的请求直接重写为.php文件,且L标记会终止后续规则执行,导致路由转发规则完全不生效。 - 规则未先检查目标文件是否存在,会把合法路由请求错误导向不存在的
.php文件,触发404。
修改后的.htaccess:
RewriteEngine On # 先检查对应.php文件是否存在,存在才重写 RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^([^\.]+)$ $1.php [NC,L] # 再检查对应.html文件是否存在,存在才重写 RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^([^\.]+)$ $1.html [NC,L] # 最后处理路由转发到index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/?$ index.php?url=$1 [L,QSA]
2. 确认NameCheap服务器配置
- 检查
mod_rewrite模块是否开启:NameCheap cPanel主机默认开启,可通过cPanel的「Apache模块」选项确认。 - 确保网站根目录的
AllowOverride设置为All,否则.htaccess文件不会生效,若无法自行修改配置,可联系NameCheap客服协助调整。
3. 排查index.php路由逻辑
- 确认
getPages()函数返回的数组包含你要访问的页面名称,比如访问/about时,about必须在数组内。 - 检查
includes/pages/目录下是否存在对应页面文件,Linux服务器区分文件名大小写,确保文件名与请求名称完全匹配。 - 你的代码会在URL路径分段≥3时直接返回404,若需要支持更深层级路径,需修改这段逻辑。
内容的提问来源于stack exchange,提问作者TheTrueJACKSONIAN
相关产品推荐
相关产品推荐

