Welcome Guest, Not a member yet? Register   Sign In
CI 4.3.2 Routing issue
#1

Hi all,
I couldn't find anything that looked like my problem in the forum so here goes.
My machine died and I had to recreate a LAMP stack on a newly installed Debian 12 OS.
All my projects work well except those using CI 4: every single one fails with routing issues. SO I tried to test with the default 4.3.2 download.
I added a controller (Test.php) for testing purposes. See below.
The CI setup:
Code:
<?php
namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Session\Handlers\FileHandler;

class App extends BaseConfig
{
    /**
    * --------------------------------------------------------------------------
    * Base Site URL
    * --------------------------------------------------------------------------
    */
//  public string $baseURL = 'http://localhost:8080/';
    public string $baseURL = 'http://ci4-test.local/';

    /**
    * Allowed Hostnames in the Site URL other than the hostname in the baseURL.
    * If you want to accept multiple Hostnames, set this.
    */
    public array $allowedHostnames = [];

    /**
    * --------------------------------------------------------------------------
    * Index File
    * --------------------------------------------------------------------------
    */
//  public string $indexPage = 'index.php';
    public string $indexPage = '';

Everything below this is unchanged

Code:
<?php
namespace Config;
$routes = Services::routes();
/*
* --------------------------------------------------------------------
* Router Setup
* --------------------------------------------------------------------
*/
$routes->setDefaultNamespace('App\Controllers');
$routes->setDefaultController('Home');
$routes->setDefaultMethod('index');
$routes->setTranslateURIDashes(false);
$routes->set404Override();
/*
* --------------------------------------------------------------------
* Route Definitions
* --------------------------------------------------------------------
*/
$routes->get('test', 'Test::index');
$routes->get('/', 'Home::index');

Everything below this is unchanged

Code:
<?php

namespace App\Controllers;

class Test extends BaseController
{
    public function index()
    {
        echo "Hello world";
    }
}

Now for the problem.
This used to work in localhost:
Code:
http://ci4-test.local/        (welcome page as expected)
http://ci4-test.local/test    (web page displaying 'Hello world')
Now I get this:
Code:
http://ci4-test.local/        (welcome page as expected)
http://ci4-test.local/test    (404)
Basically all routes pointing to controllers/methods/params result in an error 404. The only route that works is the '/' pointing to the default controller.
Since this is a brand new OS install, and a brand new LAMP stack install I am guessing the problem lies with an Apache 2 or a PHP config issue. That's been 3 days I'm racking my brains over this and can't find any lead anywhere as to what could be missing or superfluous.
Any help greatly appreciated.
Thanks all.
Reply
#2

You should really upgrade to the new CodeIgniter 4.6.0 version.
What did you Try? What did you Get? What did you Expect?

Joined CodeIgniter Community 2009.  ( Skype: insitfx )
Reply
#3

Please check if you have set your virtual hosts correctly.
Reply
#4

(This post was last modified: 01-25-2025, 11:36 AM by captain-sensible. Edit Reason: the usual suspects )

im on Linux using apache with  at the document root of apache 7 web apps  ; using virtual host files i point to the  public directory of ex app. With Arch you have to add entires to /etc/httpd/httpd.conf 
here is an example :

Code:
<VirtualHost 127.0.0.4>
    ServerAdmin webmaster@CI4-CMS
    DocumentRoot "/srv/http/CI4-CMS/public"
    ServerName CI4-CMS
    ServerAlias CI4-CMS
    ErrorLog "/var/log/httpd/CI4-CMS-error_log"
    CustomLog "/var/log/httpd/CI4-CMS-access_log" common

    <Directory "/srv/http/CI4-CMS/public">
  Order allow,deny
Allow from All
AllowOverride All
Require all granted
    </Directory>
</VirtualHost>


i set my url for each app using :
Code:
public string $baseURL = 'http://127.0.0.4/';

I then  i add that to /etc/hosts


Code:
[andrew@darkstar ~]$ cat /etc/hosts
# Static table lookup for hostnames.
# See hosts(5) for details.
127.0.0.1 localhost
::1  localhost
127.0.1.1 darkstar.localdomain darkstar
127.0.0.3 webplay
127.0.0.4 CI4-CMS

in the address bar of web browser i just type :
Code:
http://127.0.0.4/home

http://localhost:8080

is a url you might specify if your using built in spark server.  if  your app is in  apache ; although ive seen some people  talk about putting apps in Apache and  still firing up spark;  well let me not go there. if  your app is in Apache, then obviously Apache is a web server and ..well you know it. 

But either   you test your app by firing up SPARK  and see in web browser http://localhost:8080

OR     you dont touch spark and Apache is serving your stuff ; use a url in base like http://127.0.0.4



The documentation of Apache  is also quoting 127.0.0.x :
see https://httpd.apache.org/docs/trunk/gett...arted.html


im on Arch  which is not the same as  Debian but they should be quite similar. 

if your getting your main page up , then that should mean php is Ok

i've found that for both  local and live on a server there was no need to touch .htaccess file in public

on the CI4 trouble shooting page it talks about if defualt page works but not others try :
from

Code:
use CodeIgniter\Config\BaseConfig;

class App extends BaseConfig
{
    // ...

    public string $indexPage = 'index.php';

    // ...
}

to

Code:
namespace Config;
use CodeIgniter\Config\BaseConfig;
class App extends BaseConfig
{
    // ...
    public string $indexPage = 'index.php?';
    // ...
}
you have this in /etc/httpd/httpd.conf 
[code]


<IfModule dir_module>
    DirectoryIndex index.html  index.php
</IfModule>
[/code]
CMS CI4 A CMS system, runs out of the box written on top of CI4
Arch Book  CodeIgniter4 on Apache(pages 92-114) 
Reply
#5
Sad 
(This post was last modified: 01-25-2025, 03:41 PM by pierrick.)

@InsiteFX
Thank you for the suggestion. It should be noted that if there's a setup issue with the LAMP stack, CodeIgniter 4.6 is likely to fail too. IMHO addressing the issue first makes more sense, especially since all the projects I'm trying to run were working in a previous LAMP stack.

@captain-sensible
Thank you for your comprehensive answer. Back in the previous LAMP I had no virtual hosts, I used the directory approach. I originally set up the current Apache in the same way. The CodeIgniter manual mentions this setup, and as I said it was all working before. 
Seeing that I had moved PHP versions (8.1 -> 8.2) I thought maybe it'd be better to use virtual hosts. The current setup thus uses virtual hosts, and here are my current Apache 2 conf files:
apache2.conf  (unchanged from install)
Code:
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.

# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
# /etc/apache2/
# |-- apache2.conf
# | `--  ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
#  together by including all remaining configuration files when starting up the
#  web server.
#
# * ports.conf is always included from the main configuration file. It is
#  supposed to determine listening ports for incoming connections which can be
#  customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
#  directories contain particular configuration snippets which manage modules,
#  global configuration fragments, or virtual host configurations,
#  respectively.
#
#  They are activated by symlinking available configuration files from their
#  respective *-available/ counterparts. These should be managed by using our
#  helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
#  their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
#  the default configuration, apache2 needs to be started/stopped with
#  /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
#  work with the default configuration.


# Global configuration
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#Mutex file:${APACHE_LOCK_DIR} default

#
# The directory where shm and other runtime files will be stored.
#

DefaultRuntimeDir ${APACHE_RUN_DIR}

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5


# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log

#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn

# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# Include list of ports to listen on
Include ports.conf


# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>

<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>

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

#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>




# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#
AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>


#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
000-default.conf  (note the change for the new DocumentRoot location) Please remember: all NON CodeIgniter projects work fine.
Code:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /home/pierrick/www
DirectoryIndex index.php index.html index.htm
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/pierrick/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
</Directory>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
The virtual host for the CodeIgniter tests
Code:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName ci4-test.local
DocumentRoot /home/pierrick/www/ci4-test.local/public
DirectoryIndex index.php index.html index.htm

<Directory /home/pierrick/www/ci4-test.local/public/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
The hosts file
Code:
127.0.0.1 localhost
127.0.1.1 wd-debian.wysiwyg-data.net wd-debian
127.0.0.1 ci4-test.local

# The following lines are desirable for IPv6 capable hosts
::1    localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
The .htaccess file for the tests (original from the CodeIgniter 4.3.2 download found in the public directory)
Code:
# Disable directory browsing
Options -Indexes

# ----------------------------------------------------------------------
# Rewrite engine
# ----------------------------------------------------------------------

# Turning on the rewrite engine is necessary for the following rules and features.
# FollowSymLinks must be enabled for this to work.
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On

# If you installed CodeIgniter in a subfolder, you will need to
# change the following line to match the subfolder you need.
# http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
# RewriteBase /

# Redirect Trailing Slashes...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

# Rewrite "www.example.com -> example.com"
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,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 the front controller, index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA]

# Ensure Authorization header is passed along
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</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.
ErrorDocument 404 index.php
</IfModule>

# Disable server signature start
ServerSignature Off
# Disable server signature end

From what I know of Apache 2 setup, and admittedly it's very little, it all looks good.
Just in case you're wondering,
Code:
mod_rewrite
is enabled and the virtual host is also enabled.
Looking at your example conf files, other than using a virtual domain name rather than an IP, my files all look good. I believe the
Code:
Allow from All
directive is now deprecated in Apache 2.4 (adding it makes no difference and my issue remains.)

And so I still get:
Code:
http://ci4-test.local/              displays the welcome (home) page
http://ci4-test.local/test          returns GET http://ci4-test.local/test 404 (Not Found) in the browser console
In other words, still well stuck here.
Any other suggestion gratefully welcome.
Reply
#6
Big Grin 

OK so I did some further testing...
I installed a WAMP stack on my Windows 11 machine. Took a while, as I've really gone native with Linux...  Big Grin
Got Apache 2.4 and PHP 8.2 installed and configured: all good. 
I then copied an original CodeIgniter 4.3.2 download into the virtual host directory: ci4-test.local
Configured the App.php, the Routes.php and added the Test.php controller, as above in my first post.
The results:
Code:
http://ci4-test.local/        (welcome page as expected)
http://ci4-test.local/test    (web page displaying 'Hello world')

So IMHO this confirms two things:
  1. there IS a server configuration issue in the Linux box,
  2. my code does still work (I also tested another project.)
At this point I'm also going to start a thread on the Debian support forum.

Still, if someone has seen this kind of behaviour and is willing to throw in their tuppence, I'd appreciate it greatly.
Reply
#7

Oh well, lesson learned here...

In the virtual hosts I defined my domain thus:
Code:
<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName ci4-test.local
    DocumentRoot /home/pierrick/www/ci4-test.local/public
    DirectoryIndex index.php index.html index.htm

    <Directory /home/pierrick/www/ci4-test.local/public/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Unfortunately I completely overlooked the line that says: AllowOverride None
Effectively if I understand right this line disables any Apache directive in the .htaccess files. And that includes the mod_rewrite directives...
As soon as I changed this line to AllowOverride All, the test worked.

Thank you all for your help.
Reply
#8

(This post was last modified: 01-26-2025, 03:02 AM by captain-sensible. Edit Reason: usual suspects )

@Pierrick  All good and  back rocking with Linux , hopefully

With Linux all  roads lead to Arch; when you get there give me a heads up
CMS CI4 A CMS system, runs out of the box written on top of CI4
Arch Book  CodeIgniter4 on Apache(pages 92-114) 
Reply




Theme © iAndrew 2016 - Forum software by © MyBB