CodeIgniter从网址中删除index.php


159

我当前的网址看起来像这样[mysite]index.php/[rest of the slug]
我想index.php从这些网址中删除。

mod_rewrite在我的apache2服务器上启用。在config$config['index_page'] = '';

我的codeignitor根.htaccess文件包含

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

但是仍然无法正常工作。我要去哪里错了?



为什么这个问题有这么多重复的答案
Tilak Maddy

Answers:


239

尝试以下

打开config.php并执行以下替换

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

$config['index_page'] = ""

在某些情况下,的默认设置uri_protocol无法正常工作。只需更换

$config['uri_protocol'] ="AUTO"

通过

$config['uri_protocol'] = "REQUEST_URI"

.htaccess

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

注意:.htaccess代码因托管服务器而异。在某些托管服务器(例如:Godaddy)中是否需要额外使用?在上述代码的最后一行。在适用的情况下,以下行将替换为最后一行:

// Replace last .htaccess line with this line
RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 

4
我已经尝试过此代码, RewriteRule ^(.*)$ index.php/$1 [L]但是仍然可以通过domain.com/about-us,domain.com/index.php/about-us和domain.com/index.php?/about-us两种方式查看页面SEO错误,即重复的标题标签和重复的元描述
Musaddiq Khan

谢谢您的回答,我遇到了同样的问题,并添加了第一个RewriteCond使其起作用。您能否详细说明为何手册(此处为:codeigniter.com/userguide3/general/…)未提及?
克劳迪奥2014年

谢谢您的回答,我得到了坦克-auth的同样的问题
striker_axel

$_POSTisset($_POST)添加后无法正常工作。
DCK


134

步骤:-1打开文件夹“ application / config”,然后打开文件“ config.php”。在config.php文件中找到并替换以下代码。

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

步骤:-2转到您的CodeIgniter文件夹并创建.htaccess

Path:
Your_website_folder/
application/
assets/
system/
.htaccess <——— this file
index.php

步骤:-3在.htaccess文件中编写以下代码

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

第4步在某些情况下,uri_protocol的默认设置无法正常工作。要解决此问题,只需打开文件“ application / config / config.php”,然后查找并替换以下代码

//Not needed for CodeIgniter 3 its already there.
//find the below code
$config['uri_protocol'] = "AUTO"
//replace with the below code
$config['uri_protocol'] = "REQUEST_URI" 

多数民众赞成在wamp服务器中,但它不起作用,因为默认情况下rewrite_module是禁用的,因此我们需要启用它。为此,请执行以下操作

  1. 左键单击WAMP图标
  2. 阿帕奇
  3. Apache模块
  4. 左键单击rewrite_module

原始文件

范例连结


6
我必须将.htaccess放在根文件夹中,而不是“ application”文件夹中,才能完成这项工作
Mawardy

我没有CodeIgniter文件夹。你在说什么?
Nicolas S.Xu

1
它会删除index.php,但我也需要删除额外的反斜杠'/'
Pradeep Kumar Prabaharan

在config.php中更改并创建.htaccess文件后。我收到错误解析错误:语法错误,第55行的application \ config \ config.php中出现意外的'$ config'(T_VARIABLE)
Fawwad

谢谢你的回答。对我来说,我需要如图所示更新htaccess文件,然后确保它是系统文件夹的同级文件,而不是它的内部文件。
Kiky Rodriguez

44

第1步 :

将此添加到htaccess文件中

<IfModule mod_rewrite.c>
  RewriteEngine On
  #RewriteBase /

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>

第2步 :

删除codeigniter配置中的index.php

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

第三步:

允许在Apache配置中覆盖htaccess(命令)

sudo nano /etc/apache2/apache2.conf

并编辑文件并更改为

AllowOverride All

用于www文件夹

第4步 :

启用apache mod重写(命令)

sudo a2enmod rewrite

步骤5:

重新启动Apache(命令)

sudo /etc/init.d/apache2 restart

3
apache2.conf中的“ AllowOverride All”为我解决了该问题,因为默认情况下不使用.htaccess填充。
LaurentJégou15年

1
我希望我能为此给你奖金!拯救了我的一天。此后花了2个小时:|
Kiran P.

1
对于最近的Linux Distro来说,似乎要做的第一件事是编辑AllowOveride规则
Nasz Njoka Sr.

终于让它工作了。谢谢。AllowOveride规则可以帮助我解决此问题。我正在使用ubuntu 16.04
Apit John Ismail

出色的解决方案,谢谢:)
Razib Al Mamun

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

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

如果您在此订单中有url,则为site.com/index.php/class/method/id

注意:在config.php中删除index.php应该是config [index_page] =“”

注意:请注意最后一行的差异,而不是$ 0,请使用$ 1


这对我有用。上面的答案没有。我还没有测试下面的答案。
Jam Ville

这对我有用,但是我不得不从'AUTO中更改uri协议;改为“ REQUEST_URI”:$ config ['uri_protocol'] ='REQUEST_URI';
伊莎贝尔·玛兹(Isabelle Martz)2015年

RewriteRule .* index.php/$1 [PT,L]-除非你改变这将无法通过URL路径RewriteRule 模式.*(.*)。但是,如果您正在使用,$config['uri_protocol'] = 'REQUEST_URI';那么这无关紧要。
MrWhite

16

步骤1 =>将.htaccess文件放在存在应用程序和系统文件夹的根文件夹中。

步骤2 =>如果您的网络路径使用子文件夹-yourdomain.com/project/-,则在htaccess文件中使用以下代码

RewriteEngine on
RewriteBase    /project/
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /project/index.php/$1 [L]

如果您的网络路径使用根文件夹-yourdomain.com-,则在htaccess文件中使用以下代码

RewriteEngine on
RewriteBase    /
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

到目前为止,这是最佳和完整的答案。子文件夹是什么比其他答案要好。
巴维克·沙

这应该是答案。投票表决的答案与以下部分有关:RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d对我而言这不起作用。
GunWanderer '17

11

在您的htaccess上使用它,

RewriteEngine On
RewriteBase /root_folder_name/
RewriteCond %{REQUEST_URI} ^system.*
RewriteCond $1 !^(index\.php|images|js|uploads|css|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

希望这可以帮助。


root_folder_name->您是否使用根文件夹名称更改了此名称?
yuvaraj bathrabagu

是的,我做到了。我把我的codeigniter根放在那里。那是对的吗?
Nihar Sarangi 2013年

好友我正在两个CI项目中使用此.htaccess代码!都工作正常!!
yuvaraj bathrabagu 2013年

11

分两个步骤:

1)编辑config.php

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

$config['index_page'] = '’;

2)创建/编辑.htaccess文件

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

6
  1. 制作.htaccess文件并放入此代码

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

    $config['index_page'] = ''; 

去除index.php存在于config.php文件

  1. 从您的服务器上重写。

6

1.在根目录下创建一个新文件.htaccess。

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

2.转到您的config.php文件,从更改 $config['index_page'] = 'index.php'$config['index_page'] = ''


6

分2步解决。

  1. 更新配置文件application / config / config.php中的2个参数
$config['index_page'] = '';
$config['uri_protocol'] = 'REQUEST_URI';
  1. 更新根文件夹中的文件.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
      RewriteBase /
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

5

试试这个。它可能对您有所帮助。

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

将代码放在您的htaccess根文件中,并确保您拥有

$config['index_page'] = '';

在您的配置文件中。

如果您遇到任何问题,请告诉我。


那正是我在做什么。
Nihar Sarangi 2013年

4
+ Copy .htaccess from Application to Root folder
+ edit .htaccess and put

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /ci_test/

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

Note: make sure your web server is enable for  "rewrite_module"

+ Remove index.php from $config['index_page'] = 'index.php';
- edit config.php in application/config
- search for index.php
change it from  $config['index_page'] = 'index.php'; to  $config['index_page'] = '';

请观看此视频以供参考https://www.youtube.com/watch?v=HFG2nMDn35Q


4

好吧,所有这些答案都是好的,但是对于一个新手(第一次),这些令人困惑。控制器中还存在其他htaccess文件,但是我们必须在主项目文件夹中编辑或添加htaccess。

这是您的codeigniter文件夹,文件驻留在其中,例如应用程序,系统,资产,上传文件等。

Your_project_folder/
application/
assets/
cgi-bin/
system/
.htaccess---->(Edit this file if not exist than create it)
index.php

更改此文件,如下所示:

<IfModule mod_rewrite.c>
  RewriteEngine On
  # !IMPORTANT! Set your RewriteBase here and don't forget trailing and leading
  #  slashes.
  # If your page resides at http://www.example.com/mypage/test1
  # then use RewriteBase /mypage/test1/
  # Otherwise /
  RewriteBase /
  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: Anand Pandey
  ErrorDocument 404 /index.php
</IfModule>

是的,当然您需要在application / config / config.php中更改两行代码

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

由于某种原因,所有这些答案都不适用于我。在网址中添加/index.php/时,我可以访问页面。
比拉勒·艾哈迈德

3

开发生产

    # Development
    RewriteEngine On
    RewriteBase /your_local_folder/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $1 !^(index\.php|images|scripts|styles|vendor|robots\.txt)
    RewriteRule ^(.*)$ index.php/$1 [L]

    #Production PHP5 CGI mode
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $1 !^(index\.php|images|scripts|styles|vendor|robots\.txt)
    RewriteRule ^(.*)$ index.php?/$1 [L]


2

您可以转到config \ config.php文件并从此变量中删除index.php值

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

创建.htaccess文件并将此代码粘贴到其中。

<IfModule mod_rewrite.c>

 Options +FollowSymLinks

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

</IfModule>

好机会


2
  Removing index.php from url of codeigniter   

Three steps are require to remove index.php from url in Codeigniter.

1)Create .htacess file in parallel to application holder and just copy past the following code:

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

2) Change $config['index_page'] to blank in config.php in application folder as below:

$config['index_page'] = '';

3) Enable rewrite_module of apache.

1

仅需三个步骤即可从Codeigniter中的网址中删除index.php

1)与应用程序持有人并行创建.htacess文件,只需复制以下代码即可:

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

2)将$ config ['index_page']更改为应用程序文件夹中config.php中的空白,如下所示:

$config['index_page'] = '';

3)启用apache的“ rewrite_module”。

重新启动您的apache并完成它。

详细信息:http : //sforsuresh.in/removing-index-php-from-url-of-codeigniter-in-wamp/


1

我认为您的所有设置都不错,但是您确实将htaccess文件放错了位置,并将htaccess添加到项目文件中

project_folder-> htaccess

并将此代码添加到您的htaccess

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

1

您可以转到application \ config \ config.php文件并删除index.php

 $ config ['index_page'] ='index.php'; //删除index.php

改成

 $ config ['index_page'] ='';


1

试试这个RewriteEngine上

        # Removes index.php from ExpressionEngine URLs
        RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

1

这对我有用。我在codeigniter 3.1.11,PHP 5.6.40中进行了测试,我在测试服务器的apache2配置中使用了virtualhost。

<VirtualHost *:80>
     ServerAdmin webmaster@dummy-host2.example.com
     DocumentRoot (__DIR__)
     ServerName mydomain
     ##ErrorLog "logs/dummy-host2.example.com-error.log"
     ##CustomLog "logs/dummy-host2.example.com-access.log" common
     <Directory "(__DIR__)">
        Require all granted
        AllowOverride All
   </Directory>
</VirtualHost>

和/.htaccess内容

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

0

遵循这些步骤,您的问题将得到解决

1-从这里下载.htaccess文件https://www.dropbox.com/s/tupcu1ctkb8pmmd/.htaccess?dl=0

2-在第5行上更改CodeIgnitor目录名称。像我的目录名称是abc(添加您的名字)

3-将.htaccess文件保存在codeignitor文件夹的主目录(abc)中

4-在Config.php文件中将uri_protocol从AUTO更改为PATH_INFO

注意:首先,您必须通过删除注释从apachi的httpd.conf启用mod_rewrite


0

使用此代码。更改文件夹名称后,更改第二行。其中index.php文件和文件夹应用程序位于系统文件夹中。大多数情况下,由于第二行而发生问题。我们没有配置放置项目的文件夹名称。重要的是第二行。这很容易删除index.php。RewriteBase上的RewriteEngine / project_folder_name RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d RewriteRule。* index.php / $ 0 [PT,L]

#RewriteEngine on
#RewriteCond $1 !^(index\.php|images|robots\.txt)
#RewriteRule ^(.*)$ index.php/$1 [L]    

转到controller / config.php文件。

config ['index_url'] ='';

参考以进行更多研究。

https://ellislab.com/expressionengine/user-guide/urls/remove_index.php.html

https://ellislab.com/blog/entry/fully-removing-index.php-from-urls


0

除了这些答案之外,您还可以添加index.php或对其进行编辑(如果已经存在)-为了安全起见,无论如何,您都希望禁用index.php,从网站目录中列出文件,然后将内容更改为

<?php
   header('location:your_required_starting.php'); 
?>

0

次要事项:(可选)

在将vhosts中的重写引擎状态更新为之后,尝试重新启动Apache Rewrite ON

需要注意的一件事:

在Apache vhosts文件中,检查是否有此脚本行。 AllowOverride None 如果是,请删除/注释该行。

我的vhosts文件脚本:(之前)

<VirtualHost *:80>
    DocumentRoot "/path/to/workspace"
    ServerName ciproject
    ErrorLog "/path/to/workspace/error.log"
    CustomLog "/path/to/workspace/access.log" common
    Directory   "/path/to/workspace">
        Options Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory> 
</VirtualHost>

我的vhosts文件脚本:(之后)

<VirtualHost *:80>
    DocumentRoot "/path/to/workspace"
    ServerName ciproject
    ErrorLog "/path/to/workspace/error.log"
    CustomLog "/path/to/workspace/access.log" common
    Directory   "/path/to/workspace">
        Options Indexes FollowSymLinks
        #AllowOverride None
        Order allow,deny
        Allow from all
    </Directory> 
</VirtualHost>

我遇到了同样的问题,挣扎了大约1天,一切都很好。后来,通过反复试验的方法,发现了这个东西。删除后,我的工作就完成了。该URL现在不查找index.php了:)


0

如果上述所有解决方案均不起作用,则在您的项目文件夹中,它们将是两个文件index.html和index.php,将index.html重命名为index_1.html并浏览您的项目。


0

注意与添加的“?”的区别 “ .php”之后的字符,尤其是在处理CodeIgniter时:

RewriteRule ^(。*)$ index.php / $ 1 [L]

RewriteRule ^(。*)$ index.php?/ $ 1 [L]

这取决于其他几件事。.如果不起作用,请尝试其他选择!


0

您可以通过在其中放置一些代码来从网址中删除index.php .htaccess中

文件路径:根> .htacess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


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

希望它能起作用。


0

在CodeIgniter 3.16中使用htaccess来

删除index.php文件

并且

将HTTP重定向到HTTPS

以下是代码:

  • application\config\config.php档案

做出改变

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

$config['index_page'] = '';
  • 现在,打开.htaccess文件,并更新以下代码
RewriteEngine on
RewriteBase /

## Redirect SSL
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

## Remove fron url index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^/(index\.php|assets/|humans\.txt)
RewriteRule ^(.*)$ index.php/$1 [L] 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.