重定向和伪静态在网站中的应用
1.定义
重定向:通过各种方法将各种网络请求重新定个方向转到其他位置(分为内部和外部),用重定向来实现伪静态
伪静态:相对于真实静态来讲的,只是改变了URL的表现形式,实际上还是动态页面,伪静态有和真静态的SEO
2.实现方法
1)通过.htaccess文件配置
.htaccess工作原理
.htaccess文件(或者"分布式配置文件”)提供了针对
每个目录改变配置的方法,即在一个特定的目录中
放置一个包含指令的文件,其中的
指令作用于此目录及其所有子目录
.htaccess性能问题
开启访问页面,要查找所有上级的目录中的.htaccess文件
RewriteEngine on
RewriteRule ^content-([0-9]+)-([0-9]+)-([0-9]+).html index.php?m=content&c=index&a=show&catid=$1&id=$2&page=$3
2)通过Apache的主配置文件<Directory>段(需要重启服务)
ALLowOverride None
RewriteEngine On
RewriteRule 你的重写规则
3)使用PHP或者其他脚本语言实现(只能实现外部重定向)
通过PHP脚本语言跳转
header('Location:url');
3.Apache 重写原理
4.mod_rewrite
1)Apache的URL操作模块
包括RewriteBase RewriteRule RewriteCond RewriteMap
2)rewrite日志
设置LogLevel alert rewrite:trace8(1~8)
生产模式不要大于trace2
查看apache_error.log日志文件
只能在conf文件中设置,不能在.htaccess中设置
5.RewriteRule语法说明 http://httpd.apache.org/docs/current/rewrite/flags.html
RewriteRule 模式匹配 替换的URL [flags]
模式匹配支持Perl格式的正则表达式、和rewrite
的变量
替换的URL支持模式匹配的结果和rewrite变量
多个flag用逗号隔开[R=302,C]
6.RewriteRule R flag说明
强制外部重定向,后米哦按可以加301或302跳转,不加的话默认302
如 RewriteRule ^/?(.*)\.html /src/$1.php [R=302]
区别与内部重定向,浏览器上的地址会变
7.RewriteRule C flag说明
链接下一条规则
RewriteRule ^/?(.*)\.html /src/$l.htm [C]
RewriteRule ^/?(.*)\.htm /src/$l.php
与下一条规则成为一个整体,如果这一条不匹配,下一条就不进入了
8.RewriteRule L flag说明
结尾规则,立即停止重写操作,并不再应用其他重写规则
RewriteRule ^(.*) first.php?req=$1 [L]
RewriteRule ^(.*) second.php?req=$1
9.RewriteRule NE flag说明
不对URL中的特殊字符进行 hexcode 转码
RewriteRule ^(.*).htm /index.html#$1 [R,NE]
10.RewriteRule NC flag说明
不区分大小写
RewriteRule ^test/(.*) src/$1 [NC]
11.RewriteRule G flag说明
请求的网页已经失效了(gone)
RewriteRule ^oldurl.*$ - [G]
Apache 服务器会返回410
说明有些页面是有时效性的
12.RewriteRule QSA flag说明
用于在URL中截取查询字符串
RewriteRule ^per/(.*)$ /per.php?person_id=$1 [QSA,R]
访问 /per/123.php?name=xiaoming
13.RewriteBase 语法说明
RewriteBase URL-path
设置了目录级重写的基准URL
RewriteBase /test/
RewriteRule ^(.*)\.shtml$ $1.html
14.RewriteCond语法说明(rewriterule 的条件限制)
1)TestString 使用说明 $1-9
$1-9引用紧跟在RewriteCond后面的RewriteRule中模板中匹配到的数据
如:RewriteCond $1 'xcj1'
RewriteRule ^(.*)\.shtml$ $1.html
2)TestString 使用说明 %{ NAME_OF_VARIABLE}
服务器变量引用
RewriteCond %{HTTP_HOST} "127.0.0.1"
RewriteRule ^(.*)\.htm http://localhost/$1.html [R]
服务器变量 ,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE可以是下表列出的字符串之一:
HTTP头连接与请求
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
服务器自身 日期和时间 其它
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
HTTPS
3)TestString使用说明 %1-9
%1-9 RewriteCond 条件中最后符合的条件中的分组成分
RewriteCond %{HTTP_HOST} "127.0.0.(.*)"
RewriteRule %1 '1'
RewriteRule ^(.*)\.htm http://localhost/$1.html [R]
说明:%1就是上一层RewriteCond中(.*)匹配到的内容
4)CondPattern 使用说明
-d 是否为目录 -f是否为文件 -F文件存在并且可以访问
RewriteCond C:/wamp/www/ -d
5)[flags]使用说明
[NC] 大小写不敏感
[OR]条件判断的或,如果不加默认是and
RewriteCond C:/wamp/www/index.php -F [OR]
RewriteCond C:/wamp、license.txt -F
RewriteRule ^(.*)\.shtml$ $1.html
15.RewriteMap 语法说明 (只能在主配置文件配置,主配置项外面配置)
主配置文件中配置项配置语法
RewriteMap MapName MapType:MapSource
说明: MapName:命名给RewriteRule 调用
MapType:map文件的类型有 txt、rnd
MapSource:map 文件路径
1)txt格式 配置项语法:RewriteMap pages txt:C:/wamp/map.txt
${MapName:LookupKey|DefaultValue}
RewriteMap pages txt:C:wamp/map.txt
配置文件内容:
test1 pagetest1
test2 pagetest2s
RewriteRule ^(.*).shtml ${pages:$1|page}.php
2)rnd格式 配置项语法:RewriteMap dirs rnd:C:/wamp/dirs.txt
随机映射 RewriteMap servers rnd:C:/wamp/rnd.txt
配置文件内容:
URL1 S1|S2|S3
URL2 S4|S5
RewriteRule "^/(.*\.(png|gif|jpg))" "http://${servers:URL1}/$1"
16.临时重定向和永久重定向
区别和作用
不是顶级目录的A页面做301定向到其他目录B,则可以正常收录B页面
而顶级目录的A页面做302定向到其他目录B,则收录的是A页面
17.应用
1)防盗链(基于重定向的文件访问控制)
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !www.lyc.com [NC]
rewriteRule \.(gif|jpg|png)$ - [F,NC]
2)限制访问者的IP列表
RewriteMap hosts-deny txt:C:/wamp/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT_FOUND}!=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT_FOUND}!=NOT-FOUND [OR]
rewriteRule ^ - [F]
3)限制迅雷下载
通过特征限制
先通过代码分析出迅雷的特征
RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWido [NC]
RewriteRule . abuse.txt