如何编写.htaccess文件以使CodeIgniter URL路由工作?

时间:2009-09-09 00:27:03

标签: .htaccess codeigniter

我正在使用CodeIgniter运行LAMP环境。我希望能够使用其网址格式,例如http://localhost/controller/function/ID,但默认情况下,它必须是http://localhost/index.php/controller/function/ID。用户指南说我需要一个.htaccess文件来使前一种风格成为可能,并以此为例:

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

但我不明白这是如何运作的。我应该把.htaccess放在哪里?是否必须在服务器根目录中?

如果我的服务器上运行了多个站点,该怎么办?我是否必须将其放入/var/www/并根据加载的目录指定条件?或者我可以把它放在/var/www/site_using_codeigniter/中吗?我不确定如何让它发挥作用。

如果请求的URL实际上不存在,我是否可以将其设置为仅映射到MVC URL?例如,http://localhost/articles/2009/some-article-name不是服务器上的目录,因此它将映射到index.php并提供给codeigniter,但http://localhost/forum 存在于服务器,但不应由codeigniter处理。

我应该用.htaccess文件做任何其他事情吗?有什么好看的吗?

更新

我改变了我的配置文件:

$config['index_page'] = ""; //used to be "index.php"

并将其添加到.htaccess文件中:

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

并将其保存在我的网站根目录(本例中为/var/www/cms/

我进入了/etc/apache2/conf.d/security(由/etc/apache2/apache2.conf包含)并执行了此操作:

<Directory />
    AllowOverride All #was "none", but this was all commented out
    Order Deny,Allow
    Deny from all
</Directory>
然而,它仍然无法正常工作。如果我导航到http://localhost/cms/index.php/hello,则会打印“Hello there”,但http://localhost/cms/hello会出现404错误。

想法?

更新:grætsuccess!

我不得不深入挖掘我的apache配置文件,最终找到所有目录的定义位置(我在此日期之前从未在服务器配置文件中搞砸过)并发现那令人讨厌的AllowOverride None挫败了我的计划伟大。

现在它完美无缺。这里的所有答案都是切实可行的。

9 个答案:

答案 0 :(得分:18)

system/application/config/config.php中,更改

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

$config['index_page'] = "";

并在.htaccess中添加以下内容:

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

将.htaccess文件添加到system文件夹所在的同一目录中,因此在CodeIgniter根目录中,您应该

  • 系统/
  • user_guide /
  • 的index.php
  • 的.htaccess
  • LICENSE.TXT

此外,由于您的服务器上运行了多个站点,因此您可能希望拥有VirtualHosts。将此内容添加到您拥有的每个网站的apache2.conf的最后一部分:

Listen *:11000
<VirtualHost *:11000>
     ServerAdmin you@somewhere.com
     DocumentRoot "/var/www/cms"
     ServerName you-dummy.com
     <Directory "/var/www/cms">
          AllowOverride All
          Options +Indexes
          DirectoryIndex index.php
          Order allow,deny
          Allow from all
     </Directory>
     ErrorLog logs/cms_log
     CustomLog logs/cms_log common
</VirtualHost>

您现在可以从http://localhost:11000/访问该网站,并使用http://localhost:11000/hello访问该控制器。

答案 1 :(得分:16)

在这里尝试了答案,但这对我不起作用。所以我尝试了以下内容,它确实......

在根目录中创建.htaccess,其中index.php和license.txt可用。在文件中输入以下代码并存储它:

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

完成!尝试它,它肯定会工作。 希望它有所帮助

答案 2 :(得分:5)

在找到更改“AllowOverRide All”的位置时遇到了一些问题。

this guide我找到了(默认)文件。

在Ubuntu上删除Index.php CodeIgniter URL

  1. 初步说明。 我正在使用root权限运行本教程中的所有步骤,因此请确保以root身份登录:

    sudo su
    
  2. 在apache上启用mod_rewrite模块。 首先按如下方式启用模块:

    a2enmod rewrite
    

    将所有出现的“AllowOverRide None”更改为“AllowOverRide All”。基本上所有“无”到“全部”在以下文件中:

     gedit **/etc/apache2/sites-available/default**
    

    重启Apache:

    /etc/init.d/apache2 restart
    
  3. 在CodeIgniter(application \ config)上打开文件config.php。 删除$config['index_page'] = "index.php";

    上的index.php
    $config['index_page'] = "";
    
  4. 在CodeIgniter根目录下创建文件.htaccess。 使用以下代码填充文件:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
    
  5. 现在,CodeIgniter URL上的Index.php消失了

答案 3 :(得分:2)

这个特殊的.htaccess文件看起来需要进入你网站的根目录(即当前正在执行的网站。)

查看documentation for RewriteCond以了解您可以指定的其他类型的条件。基本上只有在RewriteRule的所有前一个RewriteCond匹配时才会应用RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d 。如果请求的URL不存在,您可以尝试将这些规则添加到仅重定向:

{{1}}

mod_rewrite非常强大,但如果它没有按照你的想法做到,那将是一个真正的痛苦。我也不知道有什么方法可以调试它的指令。

至于你可以用.htaccess文件做什么,Apache docs for htaccess files总是一个好的起点。最常见的用途是针对每个目录的身份验证。 .htaccess文件支持大多数服务器配置指令(假设服务器的AllowOverride这样说),但有些指令具有不同的语法。

答案 4 :(得分:1)

将它放在网站的文档根目录中。

如果您有多个网站,请将其放在每个此类网站的顶部。

如果您有多个站点在同一目录中运行,则可以使用RewriteCond将特定站点排除或包含在重写规则中。

您可以用同样的方式排除某些目录(例如/文章)。

答案 5 :(得分:1)

我在CodeIgnitor链接图像,js,css时遇到了同样的问题。 现在一切正常谢谢你们!我按照以下步骤操作。将所有其他注释合并到我的场景中。希望这有助于某人。

  1. 更改了httpd.conf

    <Directory --your root dir-- />
        AllowOverride All #was "none", but this was all commented out
        Order Deny,Allow
        Deny from all
    </Directory>
    
  2. 在htdocs \ yoursite(站点根目录)目录中创建了一个空的.htaccess文件并粘贴了以下内容。

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

答案 6 :(得分:1)

尝试这个,它可以实现穿孔

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

答案 7 :(得分:0)

<IfModule rewrite_module>
RewriteEngine on
RewriteBase /

# Removes the "/" at the end
RewriteRule (.+)/$ /$1 [L,R]

RewriteCond $1 !^(index\.php|dhtml|img|css|js|favicon\.ico|robots\.txt)
RewriteRule ^([^?&]+) /index.php/$1 [L]
</IfModule>

答案 8 :(得分:0)

RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

根文件夹中.htaccess中的简单文件!适合我。