最近将代码做了迁移,更换了web服务器,从原来的Nginx,换成使用Apache,多少有些区别。这里整理一下在apache下实现rewrite功能。
第一部分:修改apache配置文件支持rewrite
1、apache加载rewrite模块
LoadModule rewrite_module modules/mod_rewrite.so
2、支持Options FollowSymLinks
在之前配置将原本的Options FollowSymLinks修改为Options None是为了避免列出apache的目录。
<Directory "/data1/wap/htdocs/stat"> Options FollowSymLinks #Options None AllowOverride All Order allow,deny Allow from all </Directory>
在配置实现rewrite中,如果不使用Options FollowSymLinks,在查看错误日志,会发现报如下错误
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden
3、配置rewrite
a、在linux文件目录下生成.htaccess文件配置rewrite, 如下
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^/(.*) $1.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) /index.php
b、修改apache配置文件,配置rewrite规则
4、调试rewrite配置的办法
在配置文件增加如下配置,即可查看rewrite日志
RewriteLog "/data1/rewrite.log" RewriteLogLevel 9
修改apache的配置文件需要重启一下web服务,重启后,如果采用.htaccess文件修改规则的方式。在修改.htaccess文件无需重启web服务
第二部分: rewrite配置规则总结
1、Apache Rewrite规则修正符
1) R 强制外部重定向
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 不在输出转义特殊字符 \%3d$1 等价于 =$1
2、RewriteCond标志符
做判断使用,例如 RewriteCond %{REQUEST_FILENAME} -f 判断文件是否存在
3、RewriteRule标志符
执行跳转的准则
4、环境变量
环境变量名称 |
示例 |
HTTP_USER_AGENT |
|
HTTP_REFERER |
|
HTTP_COOKIE |
|
HTTP_FORWARDED |
|
HTTP_HOST |
|
HTTP_PROXY_CONNECTION |
|
HTTP_ACCEPT |
|
DOCUMENT_ROOT |
|
SERVER_ADMIN |
|
SERVER_NAME |
|
SERVER_ADDR |
|
SERVER_PORT |
|
SERVER_PROTOCOL |
HTTP/1.1 |
SERVER_SOFTWARE |
Apache/2.2.11 (Win32) PHP/5.2.9-1 |
|
|
REMOTE_ADDR |
正在浏览当前页面用户的 IP 地址 |
REMOTE_HOST |
正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR |
REMOTE_PORT |
用户连接到服务器时所使用的端口 |
REMOTE_USER |
|
REMOTE_IDENT |
|
REQUEST_METHOD |
|
SCRIPT_FILENAME |
/webRoot/t/share77.html |
PATH_INFO |
|
QUERY_STRING |
|
AUTH_TYPE |
|
|
|
TIME_YEAR |
|
TIME_MON |
|
TIME_DAY |
服务器获取当前的日值 |
TIME_HOUR |
|
TIME_SEC |
服务器获取当前时间的秒 |
TIME_MIN |
|
TIME |
服务器获取当前的时间, 格式为: 年月日时分秒 |
|
|
API_VERSION |
apache 的 API 版本信息 |
REQUEST_URI |
浏览器请求的资源信息. |
REQUEST_FILENAME |
被请求的资源的在磁盘的物理地址 |
IS_SUBREQ |
如果是 sub-request 则显示为 true, 否则为 false. |