日期:2017-01-09  浏览次数:2658 次

Rewrite规则学习及使用

一.简介

    Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。所以了解Apache的rewrite规则非常重要,可以实现URL的伪静态。或者做301跳转。

 

二.安装模块

 

1.检查是否安装模块

httpd -l |grep rewrite.c

1)如果是首次安装就需要此功能直接添加编译参数

./configure  --enable-rewrite

 

2)如果存在模块

直接修改配置文件

在相关域中开启此功能模块

vi  htttpd.conf

修改为

<Directory "YourDocumentRoot">

  Options       FollowSymLinks ExecCGI Includes

  AllowOverride  All

  Order         allow,deny

  Allow from    all

</Directory>

 

3)如果不存在此模块

移动到apache 的源码包编译加载此模块

cd  /home/apache/httpd-2.2.4/modules/mappers 

/usr/local/apache/bin/apxs -c mod_rewrite.c

/usr/local/apache/bin/apxs -i -a -n mod_rewrite mod_rewrite.la
如果没有什么错误的话,应该在你的apache的modules目录中编译出一个mod_rewrite.so文件。
编辑httpd.conf文件,确认httpd.conf中已经包含mod_rewrite.so的加载语句,如下:
LoadModule rewrite_module modules/mod_rewrite.so
这时,你的apache应该已经支持rewrite。
重启服务器apache使配置生效

service  httpd   restart

 

三.规则说明

 

1.常用正则表达式含义

 

? 0-1个字符              .   1个字符

*  0-x个字符              +  1-x个字符

^  段落开始字符           $   段落结束字符

\  转移字符               !  取反

( ) 内存限定传值

[0-9]   所有数字字符        [a-z]所有小写字母

[A-Z]  所有大写字母

 

2.模块使用参数(.htaccess)

RewriteEngine     On     是否打开模块

RewriteCond              条件

RewriteRule       [  ]    规则设定

 

1) R[=code](force redirect) 强制外部重定向

强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。

2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。

3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

4) P(force proxy) 强制使用代理转发。

 

5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

6) N(next round) 重新从第一条规则开始运行重写过程。

7) C(chained with next rule) 与下一条规则关联

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

8) T=MIME-type(force MIME type) 强制MIME类型

9) NS (used only if no internal sub-request) 只用于不是内部子请求

10) NC(no case) 不区分大小写

11) QSA(query string append) 追加请求字符串

12) NE(no URI escaping of output) 不在输出转义特殊字符

例如:RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

13) PT(pass through to next handler) 传递给下一个处理

例如:

RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理

Alias /def /ghi

14) S=num(skip next rule(s)) 跳过num条规则

15) E=VAR:VAL(set environment variable) 设置环境变量

 

3服务器请求端信息列表(拓展见五内容)

RewriteCond  %{server_prot}  !^80$    请求非80端口的

RewriteCond  $[request_filename]   !-d  请求文件类型为非文件夹

             $[request_filename]   !-f  请求文件类型为非文件

RewriteRule   .?     /404.html    [L] 

转发强写入404页面并结束上面条件生效

RewriteCond  %{http_referer}    !^$

RewriteCond  %{http_referer}    !^http://192.168.1.131

RewriteRule  \.(gif|jpeg|png|bmp)  noimg.html       [L]

 

四.实例解析

 

<IfModule mod_rewrite.c>

RewriteEngine  On

RewriteCond  %{server_prot}  !^80$

RewriteRule  ^(.*)$  http://www.baidu.com/$1 [R,L]

RewriteRule  ^(\d+)\.html$   p.php?id=$1  [L]

#RewriteRule  ^/(.+)$      $1?id=1   [L]

</IfModule>

五.其他参数

 

Apache Rewrite服务器变量介绍

Rewrite作为 Web 服务器的核心功能之一,提供了通过正则表达式与请求路径的匹配,同时还提供了一个系统级变量供调用,本篇文章主要介绍Apache 中Rewrite模块的服务器变量信息,

Apache提供给rewirte模块的环境变量大概分成5个类型. 下面一一说明.以下列表传于apache官方文档.

第一部分: HTTP headers 部分参数

参数名称: HTTP_USER_AGENT
样例参考值: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_USER_AGENT"]

参数名称: HTTP_REFERER
样例参考值: http://www.test.cn/test.php
说明: 相当于PHP中的服务器参数: _SERVER["HTTP_REFERER"]

参数名称: HTTP_COOKIE
样例参考值: ZDEDebuggerPresent=php,phtml,php3
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_COOKIE"]

参数名称: HTTP_FORWARDED
样例参考值: 如果使用代理服务器的话会是代理服务器的IP地址, 本地不容易搭环境测试出值来.
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_FORWARDED"]

参数名称: HTTP_HOST
样例参考值: www.test.com
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_HOST"]

参数名称: HTTP_PROXY_CONNECTION
样例参考值: 网络连接代理方面的信息. 和HTTP_FORWARDED参数一样. 本地不容易搭环境测试出值来.
说明: PHP中貌似未提供这样的服务器信息值. 如果又的话可能等值于: $_SERVER["HTTP_PROXY_CONNECTION"]

参数名称: HTTP_ACCEPT
样例参考值: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_ACCEPT"]

第二部分: server internals 部分参数

参数名称: DOCUMENT_ROOT
样例参考值: C:/webRoot/t
说明: 相当于PHP中的服务器参数: $_SERVER["DOCUMENT_ROOT"]

参数名称: SERVER_ADMIN
样例参考值: youemailaddress@gmail.com
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_ADMIN"]

参数名称: SERVER_NAME
样例参考值: www.test.com
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_NAME"]

参数名称: SERVER_ADDR
样例参考值: 127.0.0.1
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_ADDR"]

参数名称: SERVER_PORT
样例参考值: 80
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_PORT"]

参数名称: SERVER_PROTOCOL
样例参考值: HTTP/1.1
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_PROTOCOL"]

参数名称: SERVER_SOFTWARE
样例参考值: Apache/2.2.11 (Win32) PHP/5.2.9-1
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_SOFTWARE"]

第三部分: connection & request 部分参数

参数名称: REMOTE_ADDR
样例参考值: 127.0.0.1 正在浏览当前页面用户的 IP 地址。
说明: 相当于PHP中的服务器参数: $_SERVER["REMOTE_ADDR"]

参数名称: REMOTE_HOST
样例参考值: 127.0.0.1 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR
说明: 相当于PHP中的服务器参数: $_SERVER["REMOTE_HOST"]

参数名称: REMOTE_PORT
样例参考值: 2574 (变化的值)用户连接到服务器时所使用的端口
说明: 相当于PHP中的服务器参数: $_SERVER["REMOTE_PORT"]

参数名称: REMOTE_USER
样例参考值: 空
说明: PHP 好像未提供相关的$_SERVER值.

参数名称: REMOTE_IDENT
样例参考值: 空
说明: PHP 好像未提供相关的$_SERVER值.

参数名称: REQUEST_METHOD
样例参考值: GET
说明: 相当于PHP中的服务器参数: $_SERVER["REQUEST_METHOD"]

参数名称: SCRIPT_FILENAME
样例参考值: C:/webRoot/t/share77.html
说明: 相当于PHP中的服务器参数: $_SERVER["SCRIPT_FILENAME"]

参数名称: PATH_INFO
样例参考值: 空
说明: 相当于PHP中的服务器参数: $_REQUEST["PATH_INFO"]

参数名称: QUERY_STRING
样例参考值: a=b&c=d&e=f
说明: 相当于PHP中的服务器参数: $_SERVER["QUERY_STRING"]

参数名称: AUTH_TYPE
样例参考值: 空 当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个是认证的类型
说明: 相当于PHP中的服务器参数: $_SERVER["AUTH_TYPE"]

第四部分: date and time 部分参数

参数名称: TIME_YEAR
样例参考值: 2009
说明: 服务器获取当前的年份值

参数名称: TIME_MON
样例参考值: 04
说明: 服务器获取当前的月份值

参数名称: TIME_DAY
样例参考值: 22
说明: 服务器获取当前的日值

参数名称: TIME_HOUR
样例参考值: 16
说明: 服务器获取当前时间的小时

参数名称: TIME_MIN
样例参考值: 26
说明: 服务器获取当前时间的分钟

参数名称: TIME_SEC
样例参考值: 34
说明: 服务器获取当前时间的秒

参数名称: TIME_WDAY
样例参考值: 3
说明: 服务器获取当天是星期几, 从星期日-星期六, 数字从 0-6

参数名称: TIME
样例参考值: 20090422162634
说明: 服务器获取当前的时间, 格式为: 年月日时分秒

第五部分: specials 部分参数

参数名称: API_VERSION
样例参考值: 20051115:21
说明: apache 的 API 版本信息.

参数名称: THE_REQUEST
样例参考值: GET /share77.html HTTP/1.1
说明: 浏览器发给服务器的请求值. 不包括其他的头信息.

参数名称: REQUEST_URI
样例参考值: /share77.html
说明: 浏览器请求的资源信息.

参数名称: REQUEST_FILENAME
样例参考值: C:/webRoot/t/share77.html
说明: 被请求的资源的在磁盘的物理地址.

参数名称: IS_SUBREQ
样例参考值: false
说明: 如果是 sub-request 则显示为 true, 否则为 false.

参数名称: HTTPS
样例参考值: off
说明: 如果连接使用 SSL/TLS 模式, 则值为on , 否则值为off, 这个参数比较安全, 即使未载入 mod_ssl 模块时.