伪静态和重定向学习笔记

在HTTP中,301永久重定向,302临时重定向,重定向技术来实现伪静态,最大的一个好处就是安全。因为可以不暴露web程序的真实地址

第一个例子

  • 修改Apache的配置,修改目录权限AllowOverride All
  • 工作环境生成.htaccess文件避免每次重启apache
  • 生产环境中配置到apache配置中
<Directory />
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

windows下无法创建htaccess文件,小技巧echo 1>.htaccess

RewriteEngine on
RewriteRule ^(.*)\.hang$ $1.html

重启apache

重定向和伪静态的实现方法

  • 通过.htaccess文件配置

工作原理:
           .htaccess文件(或者分布式配置文件)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有目录
           性能问题:
           开启后访问页面,要查找所有上级的目录中的.htaccess文件
           解决办法:
           可以被主配置文件替代

  • 通过Apache的主配置文件<Directory>段,重启apache
<Directory />
    AllowOverride None
    RewriteEngine On
    RewriteRule ^(.*)\.htm$ $1.html
</Directory>
  • 使用php或者其他脚本语言实现(只能实现外部重定向)
<?php
header("Location:abc.html");
//访问index.php跳转到abc.html
?>

Apache重定向原理流程图

  1. apache收到一个url请求
  2. 判断是否开启了Rewrite模块,没有就直接访问服务器资源
  3. 有的话就进入第一条RewriteRule,检查是否能匹配上,匹配到的话就检查这条RewriteRule上面有没有RewriteCond,没有的话就进行替换,把url重定向,进入下一条RewriteRule
  4. 如果RewriteRule(1)之上有RewriteCond的话,就要先判断是否满足该条RewriteCond的条件,不满足就直接不替换(重写)url,进入下一条RewriteRule(2)(就是RewriteRule(1)就等于没生效了),如果也满足了RewriteCond,还得判断这条RewriteRule(1)有没有其他的RewriteCond,有的话要全部满足,才进行替换(重写)rul
  5. 经过RewriteRule处理之后分两种情况,如果url没发生改变(就是没被重写过),那就直接访问服务器资源,如果url改变了(被重写了),那就再分两种情况:第一种、跳到外部地址(例如:https://www.baidu.com)那就直接跳过去;第二种、还是跳回这个服务器,那就再走一次此流程(从1、开始)直到url经过所有RewriteRule后不改变,就可以访问资源了

Apache的URL操作模块 mod_rewrite

包含RewriteBase、RewriteRule、RewriteCond、RewriteMap;

rewrite日志配置

  1. 设置LogLevel alert rewrite:trace8(1-8)
  2. 生产模式不要大于trace2
  3. 查看apache_error.log日志文件
  4. 只能在conf文件中设置,不能在.htaccess
  5. httpd.conf、主目录下、LogLevel alert rewrite:trace8

RewriteRule语法说明

  1. RewriteRule 模式匹配 替换的URL [flags]
  2. 模式匹配支持Perl格式的正则表达式、和rewrite的变量
  3. 替换的URL支持模式匹配的结果和rewrite变量
  4. 多个flag用逗号隔开[R=302,C]
rewrite_rule_r
强制外部重定向,后面可以加301或302跳转,不加默认302
RewriteRule ^/?(.*)\.html /src/$1.php [R=302]
区别于内部重定向,浏览器上的地址会变


rewrite_rule_c
链接下一规则
RewriteRule ^/?(.*)\.html /src/$1.html [C]
RewriteRule ^/?(.*)\.html /src/$1.php 
与下一条规则成为一个整体
如果这一条不匹配
下一条就不进入了

rewrite_rule_l
结尾规则,立即停止重写操作,并不再应用其他重写规则
RewriteRule ^/(.*) first.php?req=$1 [L]
RewriteRule ^/(.*) second.php?req=$1 

rewrite_rule_NE
不对URL中的特殊字符进行hexcode转码
RewriteRule ^/(.*).\htm /index.html#$1 [R,NE]  

rewrite_rule_NC
不区分大小写
RewriteRule ^test/(.*)  src/$1 [NC] 

rewrite_rule_G
请求的网页已经失效

rewrite_rule_QSA
用于在URL中截取查询字符串
RewriteEngine on
RewriteRule ^per/(.*)$ /per.php?url=$1 [R]

localhost/per/index.php?name=xiaoming
跳转后localhost/per.php?url=index.php

RewriteEngine on
RewriteRule ^per/(.*)$ /per.php?url=$1 [R,QSA]

localhost/per/index.php?name=xiaoming
跳转后localhost/per.php?url=index.php&name=xiaoming

RewriteBase URL-path
设置了目录级重写的基准URL
RewriteBase /test/
RewriteRule ^(.*)\.htm$ $1.html

#文件访问控制_防盗链:基于重定向的文件访问控制
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{Http_REFERER} !localhost [NC]
RewriteRule \.(gif|jpg|png)$ - [F,NC]

#限制访问者的IP列表
RewriteMap hosts-deny txt:c:/wamp/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}!=NOT-FOUNT [OR]
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}!=NOT-FOUNT 
RewriteRule ^ -[F]

猜你喜欢

转载自blog.csdn.net/Dote2r/article/details/84669505
今日推荐