Issues in removing index.php in CodeIgniter 3

2019-02-23 06:08发布

问题:

I want to access my URL's without index.php in CodeIgniter. Here is my Blog controller

class Blog extends CI_Controller {

    public function index() {
        echo 'hello world';
    }

    public function about() {
        echo 'about page';
    }
}

Now I can access index via http://localhost/codeigniter/index.php/Blog, but I need to access it with this URL http://localhost/codeigniter/Blog.

NOTE

I removed index.php from config file .htaccess file

RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* index.php/$0 [PT,L]

Environment

Windows, XAMPP, PHP Version 5.6.3

回答1:

How to removed index.php from url has been asked so many times, It is the same as what is for codeigniter 2 and 3.

For Xampp With Codeigniter Windows

Find application/config/config.php

Replace This

$config['base_url'] = "";

With This

$config['base_url'] = "your-project-url";

Replace This

$config['index_page'] = "index.php"

With This

$config['index_page'] = ""

In main directory create file called .htaccess

I use code below works fine for me in xampp in windows. More htacces here

Options +FollowSymLinks
Options -Indexes

<FilesMatch "(?i)((\.tpl|\.ini|\.log|(?<!robots)\.txt))">
    Order deny,allow
    Deny from all
</FilesMatch>

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

Note: make sure your controllers are like example Welcome.php instead of welcome.php also you might need to create new routes in your route.php if remove index.php



回答2:

I just now struggled with this part again, even after being used to Codeigniter for 2+ years.

None of the answers helped me exactly, including the official Codeigniter's page about this, so I'm posting the solution that worked for me.

  1. Enable Rewrite engine

    sudo a2enmod rewrite
    
  2. Change Apache's config file to allow folders to allow overriding of default security setting

    sudo nano /etc/apache2/apache2.conf
    

Under the "Directory" options depending on the location of your files, edit

    AllowOverride None

to

    AllowOverride All

e.g.: My server files are in "/var/www", so my final result for corresponding Directory options is:

    <Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
  1. Create a ".htaccess" file in the root of your Codeigniter project, i.e.: along with where applications, system folders exist.

In the file, put the following:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
  1. In config/config.php file, change:

    $config['index_page'] = 'index.php';
    

to

    $config['index_page'] = '';
  1. Restart apache2:

    sudo service apache2 restart
    

Enjoy!



回答3:

Please change your base_url path which exist in application/config

$config['base_url'] ='localhost/projectname/index.php' 

to

$config['base_url'] ='localhost/projectname/' 


回答4:

Enable mod_rewrite restart your apache server and in your .htaccess

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


回答5:

To remove index.php create a .htaccess file in the same folder as your site’s main index.php file.
Then add the following code to this newly created .htaccess file:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Removes index.php from ExpressionEngine URLs
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteCond %{REQUEST_URI} !/system/.* [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

    # Directs all EE web requests through the site index file
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

this code have two parts
1 - remove index.php
2 - redirect all site requests to the index file.



回答6:

Step:-1 Open the folder “application/config” and open the file “config.php“. find and replace the below code in config.php file.

 //find the below code   
    $config['index_page'] = "index.php" 
    //replace with the below code
    $config['index_page'] = ""

Step:-2 Write below code in .htaccess file

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>

Step:-3 In some case the default setting for uri_protocol does not work properly. To solve this problem just open the file “application/config/config.php“, then find and replace the below code

//find the below code
$config['uri_protocol'] = "AUTO"
//replace with the below code
$config['uri_protocol'] = "REQUEST_URI" 


回答7:

in config.php

$config['base_url'] = '';
$config['index_page'] = '';

in .htacess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>


回答8:

finally this is worked fine for me. i have changed .htaccess file with this content

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /codeigniter

    #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>

And these changes made

    $config['index_page'] = "index.php" 
        //replace with the below code
        $config['index_page'] = ""
$config['base_url'] = "your-project-url";


回答9:

Alright, i've been strugling with this for two days, and here is my solution for XAMPP and CodeIgniter 3

Create new ".htaccess" file in root directory (not in CodeIgniter's application folder, where there's another htacces file, don't touch that one), with this inside:

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

Then, find and change this values on config.php (CodeIgniter file, on config folder):

$config['base_url']     = 'localhost/YourProject';
$config['index_page']   = '';
$config['uri_protocol'] = 'REQUEST_URI';

Finally, on httpd.conf (Apache config file), find:

#LoadModule rewrite_module modules/mod_rewrite.so

and uncomment the line (remove #).


That's it! Now

localhost/myProject/news

works as if I write

localhost/myProject/index.php/news