apache url 重写规则
1,url的重定向和伪静态:
<IfModule mod_rewrite.c>//判断加载模块是否存在 RewriteEngine on //开始重写规则 RewriteCond %{HTTP_HOST} 42\.120\.19\.243 [NC]//判断HTTP_HOST里面是否有这个ip,!表示不存在的意思; RewriteRule ^(.*)$ http://www.baidu.com [L,R=301]//url重定向,如果是302则R=302; #RewriteRule /(\w+)\.html$ /$1.php //此行代码也会进行301跳转,但是没有301标志;只是url跳转;
#RewriteRule /^(.*)(\w+)\.html$ $1/$2.php //此代码表示正在的伪静态 </IfModule>
2,rewrite的常用规则如下:
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 不在输出转义特殊字符。
3,RewriteCond的用法
RewriteCond 重写规则执行条件 语法: RewriteCond TestString CondPattern 生效域: server config, virtual host, directory, .htaccess 特别的上面的 TestString, 可提供反向引用. 引用模式为: %N 其中N为(0 <= N <=9), 引用当前若干RewriteCond条件中最后符合的条件中的分组成分, 也就是括号里的内容.不过用到的不多. 反向应用多在RewriteRule里常用. RewriteCond 语法中的 TestStrng 为要被检查的内容, CondPattern 是进行匹配的规则, 它是一个兼容Perl风格的正则表达式和一些其他的特有字符属性. 这里介绍一下. 第一个: ! (感叹号) 表示否的意思. 比如一个条件: 判断访问此页面的上一页URL是否包含 sex 字符的话可以用这样: RewriteCond %{HTTP_REFERER} !(sex) 第二个: < 就是小于的意思, TestString < CondPattern. 第三个: > 就是大于于的意思, TestString < CondPattern. 第四个: = 相等的意思. <, >, = 三个和通常程序语言使用的 <, >, = 功能类似. 第五个: -d 是否是一个目录. 判断TestString是否不是一个目录可以这样: !-d 第六个: -f 是否是一个文件. 判断TestString是否不是一个文件可以这样: !-f 第七个: -s 是否是一个正常的有大小的文件. 判断TestString是否不是一个正常的有大小的文件可以这样: !-s 第八个: -l 是否是一个快捷方式文件. 判断TestString是否不是一个快捷方式文件可以这样: !-l 第九个: -x 是否是一个文件并且又执行权限. 判断TestString是否不是一个文件并且又执行权限可以这样: !-x 第十个: -F 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。 第十一个: -U 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能. 另外: RewriteCond 指令后面可带 Flag, 现在只要2个可用, 一个是 NC|nocase, 不区分大小写的意思. 一个是 OR|ornext 表示连接下一个条件的意思. RewriteCond 实际需要使用情况比如要判断一个条件成真的时候才执行相关的重写操作. 紧接着它下面的 RewriteRule 总是在RewriteCond 条件判断为真的时候才被执行.
例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR]
4,关于RewriteBase 和htaccess
RewriteEngine On RewriteBase / //RewriteBase只有在目录中有效,不能用在apache的httpd.conf配置文件中,一般用在.htaccess文件中 RewriteRule ^show-([0-9]+)-([0-9]+)\.html$ index.php?action=show&id=$1&page=$2
注意:要使用htaccess,AllowOverride None要改为AllowOverride all 才能起作用
2,一般情况下不用htaccess,除非万不得已的情况下,因为在httpd.conf中重新规则只需要判断一次,如果用.htaccess,那么每个文件夹,如果当前文件夹下没有则查找
其父文件夹再判断,如果父亲文件夹和子文件夹都有.htaccess,那么发文件夹中的.htaccess会被覆盖掉