一、开启重写模块
apache 的配置文件 httpd.conf 开启 LoadModule rewrite_module modules/mod_rewrite.so
二、配置重写规则
1. apache 主配置文件 httpd.conf (服务器级别,需要拥有服务器的管理权限)
2. 使用在httpd.conf里定义的虚拟主机配置中
3. 目录下 .htaccess 文件中(目录级http://www.haolizi.net/别,作用于当前目录项目)
如果是使用 .htaccess 需要在主配置文件中对网站所在目录定义以下内容
-
<Directory /var/www/>
-
Options Indexes FollowSymLinks
-
AllowOverride All
-
Require all granted
-
</Directory>
//一般情况下是 AllowOverride None 改成 All 后即表示整台服务器上都支持URL规则重写,apache服务器要读取每个项目目录下的 .htaccess 文件 ,如果没有这个文件或者没有定义任何关于url的规则就不会有效果
修改为 all 后需要重启 apache #sudo /etc/init.d/apache2 restart
重启后或许会报505错误,解决方法 #sudo a2enmod rewrite #sudo service apache2 restart
虚拟主机配置示例:
<VirtualHost *:80>
#网站目录,如果在www目录下的php目录,下面 #就填写F:/www/php
DocumentRoot "D:/phpstudy/www"
#域名
ServerName www.baidu.com
#这里配置默认首页
DirectoryIndex index.html index.htm index.php
<Directory />
Options FollowSymLinks
#不允许别人修改我们的页面,为all 时 .htaccess 文件才生效
AllowOverride None
#设置访问权限
order allow,deny
Allow from all
</Directory>
</VirtualHost>
/usr/local/apache/conf/httpd.conf 配置:
options Indexes followsymlinks #翻译后为 选项索引跟随链接
allowoverride all #允许重写
rewriteengine on #重写引擎
rewritebase /
rewriterule ^(.*)$ index.html [R=301]
rewritebase / 的作用是如果在下面的rewriterule定义中被重写后的部分 (此处为文件名index.html) 前面没有 /,则是相对目录,相对于这个rewritebase后面的定义也就是 /usr/local/apache/htdocs/index.html ,否则,如果此处没有 rewritebase / 这一项,则被重写成http://127.0.0.1/usr/local/apache/htdocs/manual/index.html 显然是不正确的。 通常不用写 rewritebase / 这一项,而直接在rewriterule ^(.*)$ /index.html [R=301] 写 / 就可以,或者是 rewriterule ^(.*)$ http://127.0.0.1/index.html [R=301]
还有一些选项:
RewriteCond %{HTTP_HOST} !^www.baidu.com [NC] #声明客户端请求的主机中前缀不是www.baidu.com,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^127.0.0.1 [NC] #声明客户端请求的主机中前缀不是127.0.0.1,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明客户端请求的主机中前缀不为空
RewriteRule ^(.*) http://www.pdanda.com/ [L] #含义是如果客户端请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.pdanda.com/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的 .* 是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的 (.*)字符。
RewriteCond %{HTTP_HOST} ^wx.baidu.con [NC]
RewriteRule ^(.*) http://www.baidu.com/ [L]
上边两行的意思是将访问的网络地址是wx.baidu.com 的时候跳转到 http://www.baidu.com
.htaccess 文件
RewriteEngine On #重写引擎 On 打开,如果为 off 则重写不起作用,不用再去注释掉下方的重写规则
RewriteMap lowercase int:tolower
RewriteCond ${lowercase:%{SERVER_NAME}} ^[a-z0-9]+.eact.com.cn$ #重写条件
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C] #重写规则
使用 .htaccess 前需要把 httpd.conf 中的 AllowOverride 设为 all
Apache Rewrite规则的书写
#当访问任何以t_开头,以.html结尾的文件时,将$1用与(.*)匹配的字符替换后,访问相应的test.php页面
RewriteRule ^/t_(.*).html$ /test.php?id=$1
-
#当我们访问的地址不是以www.163.com开头的,那么执行下一条规则
-
RewriteCond %{HTTP_HOST} !^www.163.com [NC]
-
RewriteRule ^/(.*) http://www.163.com/ [L]
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
重写中设计到的特殊字符的含义【与正则表达式有些相似】
* 代表前面0或更多个字符
+ 代表前面1或更多个字符
? 代表前面0或1个字符
^ 代表字符串的开始位置
$ 代表字符串结束的位置
。为通配符,代表任何字符
\将跟在其后的字符还原为字符本身,例如“\+”代表的就是“+”,而非其它意思。
^在方括号里表示非的意思。例如[^.]代表非通配符。
文件不存在时的重定向
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? /404.php [L]
这里 -f 匹配的是存在的文件名,-d 匹配的存在的路径名。这段代码在进行404重定向之前,会判断你的文件名以及路径名是否存在,也就是在文件名和目录不存在的时候跳转404。你还可以在404页面上加一个?url=$1参数:
RewriteRule ^/?(.*)$ /404.php?url=$1 [L]
伪静态
RewriteEngine on
RewriteRule ^test([0-9]*).html$ /index.php?id=$1
将.html后缀名转换成.php
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]