Apache 上的项目部署到 Nginx 后出现的问题及解决方法(404 错误、admin.php 模块不存在等)

Apache上的项目迁移至Nginx时遇到404错误和admin.php模块不存在的问题。404错误是由于Nginx配置中只处理.php结尾的URI,解决方法是修改Nginx配置并开启PHP的pathinfo模式。admin.php问题则是路径解析错误,通过Nginx重写规则解决了后台入口文件的访问异常。

问题一(404 错误):

 CI/TP 框架写的项目本地(WAMP)环境下运行没问题,将它上传到(LNMP)服务器时:

使用 xxx.com/index.php/home/index/ 就报 404 错误,

通过 xxx.com/index.php?c=home&m=index 能正常访问。

同样的,使用 xxx.com/index.php/ 访问也是一样,在 index.php 后多加一条 “/” 之后就无法解析了。

分析:

看 nginx 配置,其中正则解析 PHP 的这段代码:

        # 配置Nginx通过fastcgi方式处理PHP请求
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }   

可见,Nginx 在遇到 xxx.php 结尾的 URI 才会将请求交给 fastcgi 处理!否则因为正则匹配不到路径导致 404 报错。

解决:

原配置修改为:

        location ~ \.php(.*)$ {
            fastcgi_pass 127.0.0.1:9000; 
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            # 要开启 phpinfo 模式
            # 即去掉 php.ini 中 ;cgi.fix_pathinfo=1 的注释
            fastcgi_param PATH_INFO $1;
            include fastcgi_params;
        }  

并且!在 php.ini 中找到

;cgi.fix_pathinfo=1

去掉注释 ;

cgi.fix_pathinfo=1

这个过程,其实就只是开启 pathinfo 模式而已!

问题二(admin.php 模块不存在):

利用Nginx 重写规则,开启隐藏 index.php 之后:

if (!-e $request_filename){
    rewrite  ^(.*)$  /index.php?s=$1  last;   break;
}  

使用 xxx.com/admin.php/system/publics/index 就会抛出异常:模块不存在:admin.php

分析:

 实际上访问的路径是:xxx.com/index.php/admin.php/system/publics/index 

解决:

利用Nginx 重写规则如下:

        if (!-e $request_filename) {
            rewrite /admin.php(.*)$ /admin.php$1 last;
            rewrite ^(.*)$ /index.php/$1;
            break;
        }

如果访问的后台入口文件就交给admin.php这个入口文件进行处理。其他情况交给index.php这个入口文件。

<think>我们正在处理一个关于FastAdmin框架的问题:用户在使用二级域名绑定模块后,出现404错误,且http_exception_template生效。 根据FastAdmin的文档和常见问题,我们可以从以下几个方面进行排查: 1. **路由配置**:确保二级域名绑定的模块路由配置正确。在FastAdmin中,路由配置文件一般在`application/config/route.php`。需要为二级域名设置正确的模块路由。 例如: ```php // 二级域名绑定到指定模块 'domain_route' => [ 'admin' => 'admin', // admin子域名绑定到admin模块 'api' => 'api', // api子域名绑定到api模块 ], ``` 2. **Nginx/Apache配置**:检查服务器配置,确保二级域名已正确解析并指向项目的public目录。同时,检查重写规则是否生效。 例如Nginx配置: ```nginx server { listen 80; server_name admin.example.com; # 二级域名 root /path/to/fastadmin/public; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php$is_args$query_string; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ``` 3. **模块是否存在**:确认绑定的模块项目存在(即`application`目录下有对应的模块目录)。 4. **404页面配置**:FastAdmin的异常页面模板位于`application/index/view/common/404.html`。如果该文件存在且配置正确,当出现404错误时应该会显示这个页面。 但是用户提到生效,可能是由于以下原因: - 模板文件路径正确,请检查路径。 - 可能由于程序错误导致无法正确渲染异常模板,可以查看日志。 5. **开启调试模式**:在`application/config/app.php`中,将`app_debug`设置为`true`,查看具体的错误信息。 6. **权限问题**:确保运行服务器的用户对项目目录有读取权限。 7. **清除缓存**:FastAdmin有缓存机制,修改配置后可能需要清除缓存(`public`目录下的`runtime`目录)。 8. **检查模块的访问控制器**:确保模块的控制器存在且命名正确(注意大小写)。 9. **检查URL重写**:确保服务器正确配置了URL重写(隐藏index.php)。在FastAdmin的public目录下有`.htaccess`(Apache)或对应的Nginx配置。 10. **检查域名绑定模块的配置**:在FastAdmin中,二级域名绑定模块需要在`application/config.php`中配置`url_domain_deploy`为true,并且配置`url_domain_rules`。 根据用户描述,404页面生效,可能是由于异常处理没有正确捕获到404异常,或者404模板路径配置错误。 另外,FastAdmin的异常处理由`think\exception\Handle`类处理,我们可以检查是否覆盖了默认的异常处理,导致404模板没有正确渲染。 建议步骤: 1. 开启调试模式,查看具体错误。 2. 检查服务器错误日志(如Nginx的error.log)和应用的日志(`runtime/log`)。 3. 确认404模板文件存在且路径为:`application/模块/view/common/404.html`(注意:模块可能有自己的404页面,如果没有则使用默认的)。 如果以上步骤无法解决,可以尝试在入口文件`public/index.php`中增加调试代码,或者检查是否因为中间件、路由拦截等导致异常处理被中断。 由于用户的问题描述中提到“http_exception_template生效”,我们重点检查异常处理部分。在ThinkPHP中,异常模板的渲染由`think\exception\Handle`类的`render`方法处理。我们可以尝试重写该方法,确保其正确调用404模板。 例如,在应用公共文件`application/common.php`中,可以定义自定义异常处理类: ```php use think\exception\Handle; use think\exception\HttpException; class MyException extends Handle { public function render(\Exception $e) { if ($e instanceof HttpException && $e->getStatusCode() == 404) { // 这里可以指定404模板 return view('common@/404'); } return parent::render($e); } } ``` 然后在`application/config.php`中配置: ```php 'exception_handle' => 'app\common\MyException', ``` 这样,当捕获到404异常时,就会渲染指定的模板。 但是,如果用户没有自定义异常处理,则使用系统默认的。因此,检查默认的异常处理是否正常工作也很重要。 如果用户按照上述步骤操作后仍然无效,可能需要进一步检查框架核心代码。 由于用户的问题描述有限,以上提供的是常见的排查步骤。 相关问题: 1. 如何配置FastAdmin的多域名访问? 2. FastAdmin中自定义错误页面的方法有哪些? 3. 如何调试FastAdmin404路由问题? 4. 在FastAdmin中,如何为模块设置同的域名? 5. 如何清除FastAdmin的缓存?</think>### FastAdmin二级域名绑定模块404错误排查指南 当FastAdmin框架中二级域名绑定模块出现404错误且`http_exception_template`生效时,可通过以下步骤排查解决: --- ### 一、核心问题排查 1. **域名解析与服务器配置** - 确保DNS已正确解析二级域名到服务器IP - Nginx/Apache需配置独立server块: ```nginx # Nginx示例(重点在root路径和try_files) server { listen 80; server_name module.yourdomain.com; # 二级域名 root /www/fastadmin/public; # 必须指向public目录 index index.php index.html; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } ``` - 执行 `nginx -t` 测试配置后重启服务 2. **FastAdmin路由配置** - 修改 `application/config.php`: ```php 'url_domain_deploy' => true, // 开启域名部署 'url_domain_rules' => [ 'module.yourdomain.com' => 'module', // 二级域名绑定模块 ], ``` - 清除运行时缓存:删除 `runtime` 目录下所有文件 3. **模块基础验证** - 确认模块存在:`application/module` 目录有对应模块文件夹 - 检查控制器:`application/module/controller/Index.php` 是否存在 ```php namespace app\module\controller; class Index { public function index() { return "Module Works!"; } } ``` --- ### 二、404模板生效解决方案 1. **自定义异常模板路径** - 在对应模块的视图目录创建模板: ``` application/module/view/exception/404.html ``` - 在配置中指定路径(`application/config.php`): ```php 'http_exception_template' => [ 404 => 'module@exception/404' // 格式:模块@模板路径 ], ``` 2. **验证异常处理机制** - 在入口文件 `public/index.php` 后添加调试代码: ```php try { throw new \think\exception\HttpException(404, 'Test 404'); } catch (\Exception $e) { $response = new \think\Response($e->getMessage(), 404); $response->send(); } ``` 如果显示测试信息,说明异常处理正常 --- ### 三、常见错误场景 1. **路径配置错误** - ❌ 错误配置:`root /www/fastadmin;`(未指向public目录) - ✅ 正确配置:`root /www/fastadmin/public;` 2. **缓存未更新** - 每次修改配置后需: - 删除 `runtime/*` 所有缓存文件 - 清除浏览器缓存 3. **大小写敏感问题** - Linux环境下: - 控制器文件名必须为 `Index.php`(首字母大写) - 类名必须 `class Index`(首字母大写) --- ### 四、最终验证步骤 1. 直接访问控制器方法测试: ``` http://module.yourdomain.com/index.php/module/index/index ``` 若返回正常内容,说明模块路由生效 2. 检查服务器错误日志: ```bash # Nginx日志 tail -f /var/log/nginx/error.log # PHP错误日志 tail -f /var/log/php/error.log ``` 3. 临时开启调试模式(`config.php`): ```php 'app_debug' => true, ``` 查看具体错误信息 --- ### 相关问题 1. 如何在FastAdmin中配置多域名多模块独立运行? 2. Nginx重写规则导致FastAdmin路由失效如何解决? 3. FastAdmin生产环境如何安全关闭调试模式? 4. 如何为FastAdmin模块设置独立的错误页面? 5. 二级域名绑定后Session/Cookie跨域问题如何处理?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值