apache 路由、rewrite重写

发布时间:2019-08-09

一、开启重写模块

apache 的配置文件 httpd.conf   开启   LoadModule rewrite_module modules/mod_rewrite.so

二、配置重写规则

1. apache 主配置文件 httpd.conf (服务器级别,需要拥有服务器的管理权限)

2. 使用在httpd.conf里定义的虚拟主机配置中

3. 目录下 .htaccess 文件中(目录级http://www.haolizi.net/别,作用于当前目录项目)

如果是使用  .htaccess 需要在主配置文件中对网站所在目录定义以下内容

  1.  

    <Directory /var/www/>

  2.  

    Options Indexes FollowSymLinks

  3.  

    AllowOverride All

  4.  

    Require all granted

  5.  

    </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

  1.  

    #当我们访问的地址不是以www.163.com开头的,那么执行下一条规则

  2.  

    RewriteCond %{HTTP_HOST} !^www.163.com [NC]

  3.  

    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]