I'm using Ubuntu 13 with the following setup for a local codeigniter site.
Apache/2.4.6 (Ubuntu)
5.5.3-1ubuntu2.2
'CI_VERSION', '2.1.2'
And URLs are no longer working without index.php
. They used to work, but after upgrading from Ubuntu 12.x
to 13.x
and a few apache updates over the past year, the localhost
sites no longer work right.
if I go to localhost/index.php/controllername/
it works but if I go to localhost/controllername/ it does not.
mod_rewrite
is enabled.
CodeIgniter config has:
$config['index_page'] = '';
$config['uri_protocol'] = 'AUTO'; // tried all available options here and
Nothing worked
in the .conf
file for the domain I have this:
<Directory />
Options -Multiviews +FollowSymLinks
AllowOverride All
</Directory>
and here's the .htaccess
file commented lines are ones I tried that didn't work.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# RewriteCond $1 !^(index\.php|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
# RewriteRule .* index.php/$0 [PT,L]
# RewriteRule ^(.*)$ index.php/$1 [L,QSA]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
I've Googled and read everything I can find and tried everything I could find including several posts here on Stack Overflow, including the ones in the “Questions that may already have your answer.” Still nothing seemed to work. But like I said, this worked in the past, but only after multiple updates to the OS and Apache did I first notice it stop working.
I'll be moving away from CodeIgniter with future projects, but these projects already existed. Baffled as to what could be the issue.
SOLUTION:
turns out it was not a codeigniter issue at all. It was an apache issue but not with the rewrite rules. in my apache2.conf I had to alter the block for /var/www/
Require all granted seems to have done the trick.
DirectoryIndex index.php index.html Options Indexes FollowSymLinks AllowOverride All Require all granted
just for good measure, I made the change here as well: Options FollowSymLinks AllowOverride All Require all granted
found on askubuntu https://askubuntu.com/questions/421233/enabling-htaccess-file-to-rewrite-path-not-working
copy following code to .htaccess
in your root folder
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
Options All -Indexes
This works fine for me to remove index.php in CodeIgniter.
It doesn't seem like CodeIgniter has a default .htaccess
, so unclear where that came from. But for debugging purposes, I would recommend you do the following. First, here is your .htaccess
all cleaned up:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
Now replace your index.php
with this. It just dumps the $_GET
values passed via the .htaccess
like so:
echo '<pre>';
print_r($_GET);
echo '</pre>';
Now with that in your .htaccess
load the index page of the site/app/project in question. The output should be something like this:
Array
(
[/controllername/here/] =>
)
Which appears to be correct. But again, you would know better than us.
The purpose of doing this is to assess whether the issue is either in Apache passing proper $_GET
values to your CodeIgniter setup, which is one issue. Or whether the issue is within your CodeIgniter controller logic itself.
My gut tells me the issue is in the CodeIgniter logic in your codebase since the upgrade from Ubuntu 12.x
to Ubuntu 13.x
includes an upgraded version of PHP
from version 5.3
in Ubuntu 12.x
to version 5.5
in Ubuntu 13.x
. I am using lots of code that works in PHP 5.3
and PHP 5.4
but breaks at times in PHP 5.5
since there are major changes in that codebase that will cause code to break if you don't keep on top of non-depreciated functions & such.
I would try something like:
RewriteRule ^(?!index)(.*)$ index.php?/myvariable=$1 [L]
If you know what GET variable the script is expecting for controllername
in localhost/controllername
, then in the rule replace myvariable
with that variable name.
Place the .htaccess file in the project folder like this:
htdocs/your_project/.htaccess
Try this new code for .htaccess:
RewriteEngine on
RewriteBase /your-project-directory-name/
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.