Apache运维基础4Apache的Rewrite攻略1

3次阅读

共计 4106 个字符,预计需要花费 11 分钟才能阅读完成。

简述

Rewirte 主要的功能就是实现 URL 的跳转,它的正则表达式是基于 Perl 语言。可基于服务器级的 (httpd.conf) 和目录级的 (.htaccess)两种方式。如果要想用到 rewrite 模块,必须先安装或加载 rewrite 模块。

基于服务器级的 (httpd.conf) 有两种方法,一种是在 httpd.conf 的全局下直接利用 RewriteEngine on 来打开 rewrite 功能; 另一种是在局部里利用 RewriteEngine on 来打开 rewrite 功能, 下面将会举例说明,需要注意的是, 必须在每个 virtualhost 里用 RewriteEngine on 来打开 rewrite 功能。否则 virtualhost 里没有 RewriteEngine on 它里面的规则也不会生效。

基于目录级的(.htaccess), 要注意一点那就是必须打开此目录的 FollowSymLinks 属性且在.htaccess 里要声明 RewriteEngine on。

配置方法

1. 修改 Apache 主配置文件

删除 LoadModule rewrite_module modules/mod_rewrite.so 前#

2. 想通过.htaccess 也能设置 Rewrite 规则

将网站目录配置段的 "AllowOverride" 改成 "All", 不同的虚拟机要单独配置

3. 配置项解析

RewriteEngine On|Off
是否开启 Rewire 功能
Rewrite 功能不会继承,多个虚拟机要单独设置

ReWriteRule 规则

设置 Rewrite 重写规则,一般写在.htaccess 里面, 放在根目录;.htaccess 不用重启 Apache;
原子组的引用 $1,$2…
[L]为休止符, 每个 L 为一个段落
[NC] 不区分大小写

<VirtualHost 192.168.1.22:80>
    ServerAdmin Example.com
    DocumentRoot /var/www/html
    ServerName 192.168.1.22
    ErrorLog logs/error_log
    CustomLog logs/access_log common
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule (.*)\.py$ http://192.168.1.22/$1.php #rewrite 规则
    </IfModule>
</VirtualHost>

RewriteCond

Rewrite 重写条件,如果条件不满足,放弃 RewriteRule 规则匹配,除非设置 RewriteCond 条件时加 [OR] 标记
用 %{} 来输出 Apache 变量

RewriteCond %{REQUEST_FILENAME} .*\.(jpg|jpeg|gif|png) [NC] #如果请求的是图片;

Apache Rewrite 服务器变量介绍

第一部分: 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 模块时.

正文完
 0