续:Apache重载规则详解[一]
要求2: 很多模板技术mvc中总有index.php(显示在地址栏,看着很不友好,这个怎么重载?) 比如: http://www.0377joyous.com/index.php/list/23/ 重载过后显示 http://www.0377joyous.com/list/23/更利于搜索引擎收录
规则可以这样写(这个是TP上的规则)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
分析下这个例子 简单的说 RewriteCond %{REQUEST_FILENAME} !-d#检查是否是目录
RewriteCond %{REQUEST_FILENAME} !-f#检查是否是文件
具体介绍: RewriteCond指令格式 语法: RewriteCond TestString CondPattern [flags] RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的 模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。 1、 TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的可扩展结构: 1)$N:RewriteRule后向引用,其中(0 <= N <= 9) 。$N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的 模板在当前URL中匹配的数据。 2)%N:RewriteCond后向引用,其中(0 <= N <= 9) 。%N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中 匹配的数据。 3)${mapname:key|default}:RewriteMap扩展。 2、CondPattern是条件pattern, 即一个应用于当前实例TestString的正则表达式, 即TestString将会被计算然后与 CondPattern匹配。作为一个标准的扩展正则式,CondPattern有以下补充: 1)可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。 2)CondPattern中可以使用以下特殊变量: ‘ ‘>CondPattern’ (大于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于 CondPattern为真。 ‘=CondPattern’ (等于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与 CondPattern完全相同时为真.如果CondPattern只是 “” (两个引号紧挨在一起) 此时需TestString 为空字符串方为真 。 ‘-d’ (是否为目录) 将testString当作一个目录名,检查它是否存在以及是否是一个目录。 ‘-f’ (是否是regular file) 将testString当作一个文件名,检查它是否存在以及是否是一个regular文件。 ‘-s’ (是否为长度不为0的regular文件) 将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的 regular文件。 ‘-l’ (是否为symbolic link) 将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link。 ‘-F’ (通过subrequest来检查某文件是否可访问) 检查TestString是否是一个合法的文件,而且通过服务器范围内的当 前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性 能。 ‘-U’ (通过subrequest来检查某个URL是否存在) 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前 设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能 。 3、[flags]是第三个参数,多个标志之间用逗号分隔。 1)’nocase|NC’ (不区分大小写) 在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意, 这个标志对文件系统和subrequest检查没有影响. 2)’ornext|OR’ (建立与下一个条件的或的关系) 默认的情况下,二个条件之间是AND的关系,用这个标志将关系 改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule … 如果没有[OR]标志,需要写三个条件/规则.
第二部分: RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 前面部分第二部分是正则表达,那几个字母含义在这里 【参数详解】 1) R 强制外部重定向,后面可以代301或302跳转。 2) F 禁用URL,返回403HTTP状态码。 3) G 强制URL为GONE,返回410HTTP状态码。 4) P 强制使用代理转发。 5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。 6) N 重新从第一条规则开始运行重写过程。 7) C 与下一条规则关联。 8) T=MIME-type(force MIME type) 强制MIME类型。 9) NS 只用于不是内部子请求。 10) NC 不区分大小写。 11) QSA 追加请求字符串。 12) NE 不在输出转义特殊字符。
参考文献:
http://blog.csdn.net/keyunq/article/details/2536875
http://blog.163.com/alex_kame/blog/static/1454674820109145376166/
http://www.cnblogs.com/yeer/archive/2010/08/17/1801679.html
http://www.lc365.net/blog/b/14827/
要求3:
隐藏扩展名,比如原来访问用list.php?cid=2如果隐藏扩展名那么就成了list?cid=2
RewriteRule ^/?([a-z]+)$ $1.php [L]
如果连接有html扩展的也有php的,那可以这样写
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.php [L] RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html [L]