教你如何在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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
php 中英文语言转换类代码
Aug 11 PHP
PHP删除数组中的特定元素的代码
Jun 28 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
Jun 21 PHP
PHP5.2下preg_replace函数的问题
May 08 PHP
怎样搭建PHP开发环境
Jul 28 PHP
PHP面向对象详解(三)
Dec 07 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
php快速导入大量数据的实例方法
Sep 23 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
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
经典优秀个人求职信分享
2013/12/12 职场文书
财务方面个人工作的自我评价
2013/12/28 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python