Codeigniter : Regular controllers are ok. HMVC controllers don't work (Page not found)

1.5k views Asked by At

So this is the annoying kind of problem where something works perfectly on your local project, but everything breaks once deployed in production.

In this case, i can access all the pages generated by a regular codeigniter controller (situated in application/controllers). However, once i try accessing a HMVC module, i just get a codeigniter 404 error.

Situation still ok for regular controllers:

So for instance, if i have a regular controller C1 situated in application/controllers/C1.php, which contains the function page(), i can access www.mysite.com/C1/page without an issue.

Problem for accessing HMVC controllers:

However, if i want to access the controller C2 situated in application/modules/C2/controllers/C2.php, through the url www.mysite.com/C2/page, i'll get a 404 error.

And problem accessing regular controller through ajax:

A second issue appears when performing an ajax call, using a path which references a regular CI controller. The path used in the ajax call doesn't seem to be recognized, and i receive a 500 error. However, when calling the same path directly in the URL bar, the correct function seems to be executed. I had solved a similar issue before by applying the solution found in Codeigniter base_url() not working properly for ajax. However, i have not yet identified if this is the same issue.

It feels like a loader issue, but i'm no expert!

Even if it was a loader issue, why would it work on local and not on production?

Have you ever encountered something like this? Do you have an idea on how to tackle this issue?

**Edit 3: ** I removed the 2 previous edits because they are now irrelevant.

After activating the debug mode, and adding some logs, i finally found what i think to be the answer.

Long story short, my local codeigniter version runs on windows, and for some reason, when trying to reach a controller, the case is ignored. So File.php and file.php are considered the same.

My production server however runs linux, so it doesn't consider that 2 different file names refer to the same file. So i ask for file.php, and the server answer "there's no such file", because the file i actually want is File.php.

I need to turn in. I'll propose a proper answer tomorrow after running some more checks.

Thanks,

Loïc.

2

There are 2 answers

0
Loïc N. On BEST ANSWER

So the issue was not related to regular controllers versus HMVC controllers. Basically what happens is that my local dev environment is Windows, and for some reason, windows decides that the case doesn't matter when naming a file.

So file.php would be seen as the same name as File.php (notice that the first is lowercase and the second uppercase).

In my code, i was trying to get file.php (lowercase), while the actual file was named File.php and it worked, on windows.

However, in civilized operating systems File.php and file.php are considered 2 different names, and that's why suddenly things where not working in production, even though the code was the same. The controller files just could not be found.

I changed the names of my controller files (put them in lowercase) and things are working fine now.

Thanks everyone for your suggestions.

Loïc.

1
AudioBubble On

With HMVC routes need to be like

$route['something'] = "module/controller/function";

$route['something/(:any)'] = "module/controller/function/$1";

Make sure like that also when use controllers intead of welcome.php make sure controller filename like Welcome.php

When using routes if have not remove index.php from controller then url would be

With http://localhost/project/index.php/something

Without http://localhost/project/something