重定向和伪静态的原理、语法、实践

什么是伪静态:
  伪静态是相对真实静态来讲的,伪静态只是改变了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;
}
}


原文地址:https://www.cnblogs.com/gaoyuanzhi/p/8298824.html