什么是伪静态:
伪静态是相对真实静态来讲的,伪静态只是改变了URL的表现形式,实际上还是一个动态页面。使伪静态有了真静态一样的SEO。
真实静态的开销主要是磁盘IO,伪静态增大了CPU的开销。
伪静态的应用场景:IO称为瓶颈
什么是重定向:
通过各种方法将各种网络请求重新定个方向转到其他位置(分为内部和外部)
HTTP标准协议中的3XX(主要用302,302)
用重定向技术来实现伪静态:
实现方法:
1.通过.htaccess文件配置
在每一个目录下,影响所有的子目录。
开启后访问页面,要查找所有上级目录中的.htaccess文件,会产生性能问题。
可以被主配置文件代替。
apache语法配置:
修改目录权限:AllowOverride All
#vim .htaccess RewriteEngine On RewriteRule ^(.*).htm$ $1.html #$1 是括号中匹配的规则
Windows下创建 .htaccess的方法:cmd下执行 echo “1” > .htaccess
2.通过Apache的主配置文件<Directory>字段
#vim /etc/http/conf/httpd.conf <Directory> AllowOverride None RewrireEngine On RewriteRule ^(.*).htm$ $1.html <Directory>
3.使用PHP或者其他脚本语言(只能实现外部重定向)
PHP 配置方法:
<?php header("Location:test.html"); ?>
Apache重定向原理:
http://httpd.apache.org/docs/2.4/images/rewrite_process_uri.png
mod_rewrite模块
是Apache的URL操作模块
包含 RewriteBase:指定路径,RewriteRule:指定规则,RewriteCond:条件判断,RewriteMap
两种配置方式:
1.服务器级别(配置文件)
2..htaccess文件
rewrite日志功能
Apache2.2版本 设置LogLevel alert rewrite:trace8 (1-8),生产模式不要大于2
#vim
/etc/http/conf/httpd.conf
<Directory> AllowOverride None RewrireEngine On RewriteRule ^(.*).htm$ $1.html LogLevel alert rewrite:trace2 <Directory>
Apache2.4以上版本 LogLevel,日志文件只能在配置文件中配置。
RewriteRule语法说明
1.模式匹配支持Perl格式的正则表达式、和rewrite的变量
2.替换的URL支持模式匹配的结果和rewrite变量
3.多个flag用逗号隔开[R=302,C]
RewriteRule R flag
使用说明:强制外部重定向,后面可以加301或302跳转,不加默认为302
RewrireEngine On RewriteRule ^(.*).htm$ /$1.html [R=301]
RewriteRule C flag
使用说明:链接下一条规则,与下一条规则称为一个整体,如果这一条规则不匹配,下一条就不进入了
RewrireEngine On RewriteRule ^(.*).htm /$1.html [C] RewriteRule ^(.*).html$ /$1.php
RewriteRule L flag
使用说明:结束规则,立即停止重写操作,并不再应用其他重写规则
RewrireEngine On RewriteRule ^(.*) first.php?req=$1 [L] RewriteRule ^(.*) second.php$?req=$1
RewriteRule NE flag
使用说明:不对URL中的特殊字符进行hexcode转码
RewrireEngine On RewriteRule ^(.*).htm$ /index.html#$1 [R,NE]
RewriteRule NC flag
使用说明:不区分大小写
RewrireEngine On RewriteRule ^test/(.*).htm$ /src/$1.html [NC]
RewriteRule G flag
使用说明:请求网页失效(Gone)Apache返回410
RewrireEngine On
RewriteRule ^test/(.*)$ [G]
RewriteRule QSA flag
使用说明:用于在URL中截取查询字符串
RewrireEngine On RewriteRule ^test/(.*)$ /per.php?person_id=$1 [QSA,R]
http://test/index.php?name=ming
RewriteBase语法说明
设置了目录级重写的基准URL
RewriteBase URL-path
RewrireEngine On RewriteBase / RewriteRule ^(.*).htm /$1.html [R]
#如果指定了外部重定向,不加RewriteBase /会出错,外部重定向会从根目录下找,但是没有权限
#如过没有使用[R]标签,是内部重定向,Apache有权限访问目录,不加RewriteBase /也可以
RewriteCond 语法说明
使用说明:RewriteCond指令定义了一个规则的条件,即在一个RewriteRule指令之前由一个或多个RewriteCond指令
$1-9 引用紧跟在RewriteCond后面的RewriteRule中的模板中匹配的数据
RewrireEngine On RewriteCond $1 "test" RewriteRule ^(.*).htm$ $1.html # 输入test.htm 才会进行匹配
服务器变量引用
RewrireEngine On RewriteCond %{HTTP_HOST} "127.0.0.1" RewriteRule ^(.*).htm$ http://locahost/$1.html [R] # 访问者使用127.0.0.1访问时,定向到localhost,可以用在当客户使用IP地址访问时,自动跳转到域名
%1-9 RewriteCond条件中最后符合条件中的分组成分
RewrireEngine On RewriteCond %{HTTP_HOST} "127.0.0.(.*)" RewriteCond %1 "1" RewriteRule ^(.*).htm$ http://locahost/$1.html [R] # 只有访问的是127.0.0.1才会进行匹配
-d 是否是目录
-f 是否是文件
-F 文件存在并且可以访问
[NC] 大小写不敏感
[OR]条件判断的或,不加默认是and
RewrireEngine On RewriteCond /test/www -d [OR] RewriteCond /test/abc -d RewriteRule ^(.*).htm $1.html
RewriteMap MapName MapType:MapSource
MapName: 命名给RewriteRule调用
MapType:文件类型有txt、rnd
MapSource:map文件路径。
不能在.htaccess中配置,配置在主配置文件中
语法说明
txt格式 ${MapName:Lookup | FefaultValue}
#vi /etc/http/conf/httpd.conf RewriteMap pages txt:/etc/http/conf/map.txt #vi /etc/http/conf/map.txt test1 pagetest1 test2 pagetest2 #vi .htaccess RewrireEngine On RewriteRule ^(.*).htm ${pages:$1}
rnd格式:随机映射 RewriteMap servers rnd:/etc/http/conf/rnd.txt
#vi /etc/http/conf/httpd.conf RewriteMap dirs txt:/etc/http/conf/dirs.txt #vi /etc/http/conf/dirs.txt URL1 s1|s2|s3 URL2 w1|w2|w3 #vi .htaccess RewrireEngine On RewriteRule ^(.*).htm ${dirs:$1|root}/$1.php # 匹配不成功访问root下.php
Rewrite正则表达式:
. 匹配任意字符
+ 重复匹配1个到多个
* 匹配0到多个
^ 匹配字符串开始位置
$ 匹配字符串结束位置
? 前一个匹配是可选的
[abc] 匹配其中一个字母
[^abc] 不匹配方括号中的内容
test1|test2 匹配test1或est2
扩起来的表达式按次序,后面的匹配后的处理中可以用$1-$n来访问
临时重定向和永久重定向
区别和作用(面向搜索引擎机器人)
不是顶级目录的A页面做301定向到其他目录B,则可以正常收录B页面
而顶级目录的A页面做302定向到其他目录B,则收录的A页面
基于重定向的文件访问控制
防盗链:
#vi .htaccess RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ #排除直接访问没有目标源的情况 RewriteCond %{HTTP_REFERER} !localhost [NC] #限定只能通过localhost访问 RewriteRule .(gif|jpg|png)$ - [F,NC] # 非localhost访问直接禁止
限定访者的IP列表
#vim /etc/httpd/conf/httpd.conf RewriteMap host-deny txt:/etc/httpd/conf.d/host.deny #vim /etc/httpd/conf.d/host.deny 192.168.1.100 deny #vim .htaccess RewriteEngine on RewriteCond %{host-deny:%{REMOTE_ADDR}|NOTFOUND} deny RewriteRule ^ - [F]
通过重定向限制迅雷
先通过代码分析出迅雷的特征
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^BlackWido [NC] RewriteRule . abuse.txt #vim abuse.txt 禁止访问
其他web服务器重定向配置
Nginx伪静态配置
防盗链示例
location ~*.(gif|jpg|png|swf|flv)${ root html valid_referers none blocked *.nginx.cn; if ($invalid_referer){ rewrite ^/ www.nginx.cn #return 404; } }