You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NameCheap部署PHP网站后非首页404错误求助

问题:NameCheap部署PHP网站后非首页出现404错误

我刚在NameCheap上部署了自行开发的PHP网站,首页访问正常,但访问其他页面时会出现404页面未找到错误(截图: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:16:12