教你如何在CI框架中使用 .htaccess 隐藏url中index.php


Posted in PHP onJune 09, 2014

秉承MVC架构的思想,CI中的所有控制器都需要经过单点入口文件index.php(默认)来加载调用。也就是说,在默认情况下,所有CI开发项目的URL都形如以下这种形式:

http://localhost/index.php/blog/logs/this_is_a_test_entry

很显然,默认情况下,index.php在URL地址段中的存在一定程度上影响了URL的简洁和SEO的进行。我们可以通过下面本文介绍的方法来去掉这个讨厌的Index.php。

你或许已经注意到在CodeIgniter用户手册中,已经存在关于此问题的解决方法。但官方提供的这个.htaccess配置,并不是所有时候都能解决问题。本文现在给出一个更完善的解决方案。

注意:在继续之前,请确认你的主机支持.htaccess配置。其中,如果Apache作为Web服务器,需要开启mod_rewrite模块的支持;如果将IIS作为Web服务器,则需要额外安装ISAPI_Rewrite拓展。

具体方法如下:

1. 将以下配置信息复制并保存为.htaccess文件。
以下为.htaccess文件信息

RewriteEngineOn
RewriteBase /  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule^(.*)$ /index.php?/$1 [L]      
#如果没有安装mod_rewrite模块,所有的404页面都将被 #发送到index.php,此时,程序会像没有设置隐藏时一样运行   
ErrorDocument404 /index.php

2. 将以上.htaccess文件上传到CI所在项目的根目录(即与index.php同级目录下)

3. 修改application/config.php中的如下参数:

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

$config['index_page'] = ""; //设置为空

以上三步,缺一不可。如果一切配置正常,你会发现,再次运行程序的时候,程序已经自动隐藏index.php这个URL段了!

Trackback(UTF-8):http://www.cnSaturn.com/trackback/40

CodeIgniter中开启PATH_INFO时mod_rewrite隐藏index.php的问题。

在CodeIgniter中,当我将URI寻址方式从AUTO更改为PATH_INFO时,即:

$config['uri_protocol'] = 'PATH_INFO';

注:PATH_INFO的开启,是因为我希望通过$_GET来取值,而不是系统默认的POST方式。

在此情况下如何仍然使用以上.htaccess方案,结果将是:index.php顺利隐藏,但主控制器并不能正确的获取值。

解决方案如下,就一步:

去掉以下重写规则中index.php后面的问号即可。

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

修改后的规则如下:

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

其他地方不变。

如何删除index.php文件

估计很多人学习CodeIgniter第一步想做的就是如何去掉index.php,这个官方手册就有相关教程,修改.htaccess 文件(前提是你的服务器是apache):

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

当然了,有很多人按照要求修改了,但是却出现了错误,所有的访问都404了,而且,这个404是apache的404页面,而不是CodeIgniter的404错误页面。

出现这种问题,是对apache的rewrite规则不理解:

    第一行、将RewriteEngine引擎设置为on,就是让url重写生效;
    第二行、配置url重写规则,!^(index\.php|images|robots\.txt) 这个正则表达式指明了哪些文件不需要重写,而是直接访问;
    第三行、^(.*)$是一个正则表达式,意思是对所有请求都发送到/index.php/$1,熟悉url的人都知道,以反斜杠(/)开头的,都是相对路径,相对于谁呢?根,也就是网址。

所以呢,如果CodeIgniter如果不是安装在网站的根目录,必然会出现错误。如何解决呢,在CodeIgniter手册中也给出了相应的解决方案:

把上面最后一句改为:

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

只需要去掉index.php前面的斜杠就行。

如何添加url后缀

通过上面的步骤,我们已经隐藏了index.php了,现在我们制作的网站更加的rest了,一般人已经无法一眼就看出你的网站是用CodeIgniter开发的,还是ROR开发的。

但是,如何在url后面增加后缀呢,这样,我们甚至可以隐藏或者伪造网站的开发语言,通过修改 config/config.php 文件,你可以为 CodeIgniter 生成的 URL 添加一个指定的文件后缀,比如你可以添加.html,甚至你可以添加.asp,.jsp。

这样我们就可以将 https://3water.com/index.php/news/view/about 变成 https://3water.com/index.php/news/view/about.html。
如何使用查询字符串

一般情况下我们不需要使用查询字符串,但是,总有一些特殊情况,是我们用CodeIgniter的rest模式无法完成的,这样我们就需要在 URL 中使用查询字符串:

    index.php?c=products&m=view&id=345

CodeIgniter 默认此功能是关闭的,如果想开启的话,打开配置文件 application/config/config.php 您可以看到如下内容:

    $config['enable_query_strings'] = FALSE;
    $config['controller_trigger'] = 'c'; //控制器名
    $config['function_trigger'] = 'm'; //方法名
    $config['directory_trigger']='d'; //控制器所在子目录名称

如果你将 enable_query_strings 更改为 TRUE ,那么这个功能就被激活了。此时,你就可以通过关键字来调用需要的控制器和方法了:

    index.php?c=controller&m=method

当我们在使用CodeIgniter制作分页的时候,这个就可以派上用场了。

PHP 相关文章推荐
分页显示Oracle数据库记录的类之一
Oct 09 PHP
main.php
Dec 09 PHP
mysql中存储过程、函数的一些问题
Feb 14 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
php 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
解析php中curl_multi的应用
Jul 17 PHP
PHP编程风格规范分享
Jan 15 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 #PHP
PHP遍历目录并返回统计目录大小
Jun 09 #PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 #PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 #PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 #PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 #PHP
神盾加密解密教程(三)PHP 神盾解密工具
Jun 08 #PHP
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP数组交集的优化代码分析
2011/03/06 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
js单例模式详解实例
2013/11/21 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
js获取域名的方法
2015/01/27 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
详解ES6中的let命令
2020/04/05 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
Python break语句详解
2014/03/11 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
高中生期末评语
2014/01/28 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
2015年国庆节寄语
2015/08/17 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书
python全面解析接口返回数据
2022/02/12 Python
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫
详解SQL报错盲注
2022/07/23 SQL Server