在网站根目录定义文件: .htaccess
范例:
[php]
#如果当前PHP使用的环境(Apache)加载了mod_rewrite.so模块,那么我就可以进一步利用Rewrite规则隐藏URL中的 index.php
<IfModule mod_rewrite.c>
#在某些服务器配置中,mod_rewrite要求有FollowSymlinks,否则会显示500内部服务器错误;
Options +FollowSymlinks
#打开RUL重写功能:
RewriteEngine On
#指令定义了规则生效的条件,即在下面使用RewriteRule指令之前增加了2个RewriteCond指令:
#REQUEST_FILENAME: 表示与请求相匹配的完整的本地文件系统的文件路径名;
#-d: 将REQUEST_FILENAME视为一个路径名并测试它是不是为一个存在的目录名;
#-f: 将REQUEST_FILENAME视为一个路径名并测试它是否为一个存在的常规文件;
#!: 不是
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# ^ 匹配字符串的开始; 要匹配 ^ 字符本身,请使用 \^
# () 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用;
# . 匹配除换行符 \n之外的任何单字符;
# * 匹配前面的子表达式零次或多次;
# $ 匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 \$
# /$1 实现直接变换,这时就可以将RewriteBase省略
# QSA 转换查询字符串,详见后面的补充
# PT 传递给下一个处理
# L 表明当前规则是最后一条规则,停止分析以后规则的重写
#这里将匹配到的第1个字符串作为参数作为index.php?后面的内容
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
[/php]
补充:
1、 QSA 参数的理解:
主要用于改写查询字符串QUERY_STRING。
查询字符串是指URL请求中“问号”后面的部分。比如: http://mysite/grab?foo=bar 中粗体部分就是查询字符串,其中变量名是foo,值是bar。
1)利用QSA转换查询字符串QUERY_STRING
QSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的:
[php]
RewriteEngine On
RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
[/php]
将会把请求/pages/123?one=two 映射到/page.php?page=123&one=two
注意粗体部分几乎是相同的,除了“问号”变成了“与”符号
如果没有QSA标志,那么会映射到/page.php?page=123。
如果没有用到小括号正则表达式,就不需要QSA,这在上节“长短地址转换”中已经例证过了。
小括号正则表达式可以截取查询字符串中的内容,但是如果没有开启QSA标志,那么在/page.php?page=$1中“问号”之后将会被剥离丢弃。这种特性可以用于实现“剥离查询字符串”
通过QSA,我们可以将简单链接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link
[php]
RewriteEngine On
RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
[/php]
举例:
http://e.fxian.org/v/S7019X9Q2Q
结合路由规则:
'v/:id' => 'View/index', // 'v-:id' => 'View/index
重写后为:
http://e.fxian.org/index.php/View/index/id/S7019X9Q2Q
2、ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式。
目前移动场景使用的是REWRITE模式:
是在PATHINFO模式的基础上添加了重写规则的支持,可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则。
如果是Apache则需要在入口文件的同级添加.htaccess文件,内容如下:
[php]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
[/php]
复制代码
接下来,就可以用下面的URL地址访问了:
[php]
http://localhost/app/module/action/var/value/
[/php]
我们顺便再看一下普通模式:
普通模式:也就是传统的GET传参方式来指定当前访问的模块和操作,例如:
[php]
http://localhost/app/?m=module&a=action&var=value
[/php]
复制代码
m参数表示模块,a操作表示操作(模块和操作的URL参数名称是可以配置的),后面的表示其他GET参数。