zoukankan      html  css  js  c++  java
  • apache的rewrite重写、日志切割、防盗链

    一、rewrite重写

    mod_rewrite 提供了基于正则表达式规则动态修改传入的请求的 URL 的方法。可以定义任意的的url映射到内部的站点文件中

    1演示现象,解决效果,得出rewrite概念

    2-1如何实现具体讲解步骤,可以带入原理

    2-2实践

    3剖析实现原理,提升知识面

    4小结

    1、rewrite需求

    我们在使用Apache做为Web服务器时,有时候出于SEO优化或者是url路径的简洁,需要将输入的url转换成更为友好的url,这时候就可以使用rewrite重写功能。

    rewrite还可以实现防盗链,域名跳转

    使用rewrite前:article/php?ip=1
    使用rewrite后: article/1.html
    

    使用rewrite功能首先需要开启mod_rewrite模块。yum安装的apache默认已经开启。

    2、rewrite使用详解

    rewrite规则可以在Directory指令中进行配置

    rewrite学习的三个核心是RewriteEngineRewriteCondRewriteRule

    2.1 RewriteEngine

    rewrite功能的总开关,用来开启rewrite重写功能

    RewriteEngine on
    

    2.2 RewriteCond

    RewriteCond定义规则条件,当请求满足RewriteCond配置的条件时,执行RewriteCond后面的RewriteRule语句

    比如:

    RewriteEngine on
    RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
    RewriteRule  index          index.html    
    

    上面的规则表示:如果匹配到http请求中HTTP_USER_AGENT是Mozilla//5/.0.*开头的。访问index时,会自动访问到index.html

    RewriteCond 和 RewriteRule 是上下对应的关系。可以有1个或者好几个RewriteCond来匹配一个RewriteRule

    **RewriteCond常见的HTTP请求匹配方式

    RewriteCond %{HTTP_REFERER} (www.mytest.com)
    RewriteCond %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
    RewriteCond %{REQUEST_FILENAME} !-f
    
    

    HTTP_REFERER

    判断访问者的来源

    案例:

    RewriteCond %{HTTP_REFERER} (www.mytest.com)
    RewriteRule (.*)$ mytest.html
    # 如果访问的上一个页面是www.mytest.com,无论当前访问的是哪个页面,都会跳转到mytest.html
    

    REQUEST_FILENAME

    匹配当前访问的文件

    案例:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^news/sports/(d+).html web/index.php?c=news&a=sports&num=$1 [QSA,NC,L]
    
    # 访问news/sports/123.html,真实访问的是web/index.php?c=news&a=sports&num=123
    

    -d是否是一个目录,判断是否不是一个目录:!-d

    -f是否是一个文件,判断是否不是一个问价:!-f

    $1表示第一个参数

    2.3 RewriteRule

    RewriteRule是配合RewriteCond一起使用的,RewriteRule是RewriteCond成功匹配后的具体执行过程

    RewriteRule的写法:

    RewriteRule Pattern Substitution [flags]
    

    Pattern是一个正则匹配

    Substitution匹配的替换内容

    [flags]参数限制

    [QSA]qsappend(追加查询字符串)的意思,次标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

    NCnocase(忽略大小写)的意思,它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,"A-Z"和"a-z"没有区别。这个一般也会加上,因为我们的url本身就不区分大小写的。

    Rredirect(强制重定向)的意思,适合匹配Patter后,Substitution是一个http地址url的情况,就调整出去了。

    Llast(结尾规则)的意思,就是已经匹配到了,就立即停止,不再匹配下面的Rule了,类似于编程语言中的break语法,跳出去了。

    二、apache日志切割

    1、为什么要进行日志切割

    随着网站访问越来越大,web服务产生的日志文件也会越来越大,这个时候日志文件不仅占用了大量的服务器空间,而且日志分析也很麻烦

    2、日志分割两种方式

    2.1 rotatelogs

    rotatelogs是apache自带的日志切割工具

    案例:使用rotatelogs每天记录一个日志文件

    # 编辑httpd主配置文件 /etc/httpd/conf/httpd.conf
    # 注释下面两行
    ErrorLog "logs/error_log" 
    CustomLog "logs/access_log" combined
    
    # 添加下面两行
    ErrorLog "|/usr/sbin/rotatelogs -l logs/error_%Y%m%d.log 86400"
    CustomLog "|/usr/sbin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
    

    说明:

    86400为轮转的时间,单位为秒

    2.2 cronolog

    Cronolog是一款日志轮循(rotation)工具,可以用它来把Apache、Tomcat等Web服务器上输出的日志切分成按日或月保存的文件。

    cronolog安装

    [root@ ~]# tar zxf cronolog-1.6.2.tar.gz
    [root@ ~]# cd cronolog-1.6.2/
    [root@ cronolog-1.6.2]# ./configure && make && make install
    

    案例:使用cronologs每天记录一个日志文件

    ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"
    CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined
    

    扩展:按小时轮询生成日志

    CustomLog "|/usr/local/sbin/cronolog logs /access_%Y%m%d%H.log" combined
    

    3 总结

    推荐使用cronolog,因为cronolog稳定高配置简单。

    三、apache防盗链

    防盗链就是防止别人网站代码里调用我们服务器的图片、文件、视频等资源。如果别人盗用我们的资源,会增加服务器的贷款压力。

    通过防盗链的方式,可以设置限制第三方的站点通过引用的方式获取服务器上的图片,如果想要获取本站点的图片数据,只能通过本站点访问获取,这样也有效的减少了服务器的资源。

    1、rewrite实现防盗链

    • 第一台主机和第二台主机都安装apache服务,都能正常访问
    • 第一台的网站首页添加一张图片展示
    [root@localhost html]# vi index.html
    <h1>防盗链主机</h1>
    <img src='123.pag'/>
    
    1. RewriteEngine On
    2. RewriteCond %{HTTP_REFERER} !^http://www.myitcast.com/.*$ [NC]
    3. RewriteCond %{HTTP_REFERER} !^http://www.myitcast.com$ [NC]
    4. RewriteCond %{HTTP_REFERER} !^http://myitcast.com/.*$ [NC]
    5. RewriteCond %{HTTP_REFERER} !^http://myitcast.com$ [NC]
    6. RewriteRule .*.(gif|jpg|swf)$ http://www.myitcast.com/link.png [R,NC]
    

    说明:

    第1条:开启rewrite重写

    第2~5条:开启授信任的站点,能够访问站点的图片资源

    第6条:访问站点的gif|jpg|swf等类型资源时,跳转到

    2、SetEnvIfNoCase

    通过判断浏览器头信息来阻止盗链请求

    SetEnvIfNoCase Referer "^$" local_ref
    SetEnvIfNoCase Referer "www.benet.com/.*$" local_ref
    SetEnvIfNoCase Referer "benet.com/.*$" local_ref
    <filesmatch ".(mp3|mp4|zip|rar|jpg|gif)">
    		Require all denied
    		Require env local_ref
    </filesmatch>
    

    说明:

    SetEnvIfNoCase 当满足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。

    Referer :指明了请求当前资源原始资源的URL

    所有的事都会过去,我们所有的人都是从小白开始,坚持下去。
  • 相关阅读:
    宠物收养场 Treap
    最佳课题选择
    [USACO08JAN]手机网络Cell Phone Network
    [USACO09MAR]地震损失2Earthquake Damage 2
    字符串距离 简单DP
    小行星群 网络流 二分图
    游览牧场 最小费用流
    BZOJ1391: [Ceoi2008]order
    BZOJ1570: [JSOI2008]Blue Mary的旅行
    BZOJ2243: [SDOI2011]染色
  • 原文地址:https://www.cnblogs.com/li-dy/p/12091467.html
Copyright © 2011-2022 走看看