CodeIgniter 404找不到页面,但为什么?

时间:2010-09-20 14:52:50

标签: php codeigniter routes http-status-code-404

我正在为两个应用程序(公共和管理员应用程序)使用CodeIgniter。 文档结构的重要元素是:

/admin
/admin/.htaccess
/admin/index.html
/application
/application/admin
/application/public
/system
.htaccess
index.php

/admin/.htaccess文件如下所示:

DirectoryIndex index.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

/admin/index.php有以下更改:

$system_folder = "../system";
$application_folder = "../application/admin"; (this line exists of course twice)

/application/admin/config/routes.php包含以下内容:

$route['default_controller'] = "welcome";
$route['admin'] = 'welcome';

欢迎是我的默认控制器。

当我调用域/管理员时,我收到404 Page Not Found错误。当我调用Domain / admin / welcome时,一切正常。在调试日志中,我收到以下错误消息:

DEBUG - 2010-09-20 16:27:34 --> Config Class Initialized
DEBUG - 2010-09-20 16:27:34 --> Hooks Class Initialized
DEBUG - 2010-09-20 16:27:34 --> URI Class Initialized
ERROR - 2010-09-20 16:27:34 --> 404 Page Not Found --> admin

奇怪的是,这个设置完全适用于我的本地MAMP安装(使用localdomain / admin /),但是当我在“实时”服务器上发布并测试它时,我只得到404错误。

有什么想法吗?我究竟做错了什么? 谢谢 下进行。

12 个答案:

答案 0 :(得分:15)

问题的原因是服务器使用FastCGI运行PHP。

将config.php更改为

$config['uri_protocol'] = "REQUEST_URI";
一切顺利。

答案 1 :(得分:6)

将此答案留给遇到我情况的其他人。

我的codeigniter应用程序在localhost / WAMP中工作正常,但在推送到AWS EC2实例时无法路由并产生404未找到的错误。我的问题已从HERE htaccess works in localhost but doesn't work in EC2 instance

的答案中解决

(路线到我的管理页面) {domain} / admin正在制作404

需要修改/etc/httpd/conf/httpd.conf文件。

- " DocumentRoot" / var / www / html"" (2个地方)" AllowOverride无"需要更改为" AllowOverride All"。

从AWS仪表板重新启动EC2实例。

{domain} / admin现在可以访问并按预期工作。

希望这有助于其他人喜欢它帮助我!

答案 2 :(得分:6)

您可以尝试两种方法中的一种或两种方式的组合。

  1. 确保您的控制器名称以大写字母开头。例如" Mycontroller.php"
  2. 如果您没有对路线进行任何更改,由于某些奇怪的原因,您可能需要在您的网址中加入大写字母。例如,如果你的控制器是Mycontroller.php'使用名为' testfunc'的函数在它里面,那么你的网址将如下所示:" http://www.yourdomain/index.php/Mycontroller/testfunc"。注意大写字母。 (我假设您没有添加htaccess文件来删除' index.php'部分。如果有,请将其从网址中删除。)
  3. 我希望这有助于某人

答案 3 :(得分:4)

  1. 将控制器名称首字母更改为大写。
  2. 更改与控制器名称相同的网址。
  3. e.g:

    您的控制器名称是YourController

    您的网址必须是:

    http://example.com/index.php/YourController/method

    不是:

    http://example.com/index.php/yourcontroller/method

答案 4 :(得分:2)

我们必须在服务器端以较小的情况提供控制器名称

$this->class = strtolower(__CLASS__);

答案 5 :(得分:1)

您的文件夹/文件结构对我来说有点奇怪。我无法弄清楚你是如何制定的。

  

您好我正在为两个应用程序(公共和管理员应用程序)使用CodeIgniter。

这听起来像你有两个单独的CI安装。如果是这种情况,我建议不要这样做。为什么不在管理控制器中处理所有管理员的东西?如果您确实需要两个单独的CI安装,请确保它们绝对是不同的实体,并且两者不会相互冲突。这一行:

$system_folder = "../system";
$application_folder = "../application/admin"; (this line exists of course twice)

你说的这个地方存在(/admin/index.php ...或你的意思是/ admin / application / config?)让我摸不着头脑。你有admin / application / admin和顶层的系统文件夹吗?

答案 6 :(得分:1)

迁移到新环境后我遇到了同样的问题,只是服务器没有运行mod_rewrite

快速sudo systemctl restart apache2 然后<script> var input_fields = document.getElementsByTagName('input'); for(var i = 0; i < input_fields.length; i++) { if(input_fields[i].type.toLowerCase() == 'text') { input_fields[i].setAttribute('pattern', '([a-z]{2}[0-9]{2})'); } } </script>

问题解决了......

感谢@fanis在他对这个问题的评论中指出了这一点。

答案 7 :(得分:1)

如果安装了新的Codeigniter,请检查是否在根目录中添加了.htaccess文件。 如果尚未添加,请添加。 您可以将默认内容放在.htaccess文件中,如下所示。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

#When your application folder isn't in the system folder
#This snippet prevents user access to the application folder
#Submitted by: Fabdrol
#Rename 'application' to your applications folder name.
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
# If we don't have mod_rewrite installed, all 404's
# can be sent to index.php, and everything works as normal.
# Submitted by: ElliotHaughin

ErrorDocument 404 /index.php
</IfModule>

答案 8 :(得分:0)

在我的情况下,我在localhost上使用它而忘记更改RewriteBase中的.htaccess

答案 9 :(得分:0)

如果您的应用程序位于子文件夹中,则目录和URL中的文件夹名称必须相同(区分大小写)

答案 10 :(得分:0)

发生这种情况的原因多种多样,但是在扩展控制器时,上面的“ className”缺少答案。

确保您的类名与控制器名相同。例如。, 如果您的控制器名称是Settings.php,则必须像这样扩展控制器。

class Settings extends CI_Controller
{
// some actions like...
     public function __construct(){
     // and so and so...
     }
}

答案 11 :(得分:0)

修改apache配置文件如下:

sudo nano /etc/apache2/apache2.conf 

转到第 172 行并更改

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

然后最后

sudo systemctl restart apache2