重定向和伪静态在网站中的应用

前言:一直想学这么课程,这次抽出时间在慕课网看了一套,在此做重点笔记,感谢老师的讲解。

学习地址:https://www.imooc.com/learn/798

PS:伪静态在 web 应用中很广泛,就是我们在 Thinkphp 和 Laravel 中的路由一样,但是市面上的框架已经提供了写好的伪静态规则,包含 nginx 和 apche 等,基于 SEO 的重要性,所以特别有必要了解和学习。

注意:本教程使用 apche 的重写模块来做教程,并且使用 Window 的 Wamp 环境来演示,但学会之后,操作 nginx 也是类似的。 

一:什么是伪静态和重定向:

伪静态只是改变了 URL 的一种表现形式,实际上还是动态页面,只不过伪静态具有和真静态一样的 SEO。

原始:https://www.xxx.com/index.php?page=3
伪静态:https://www.xxx.com/page/3

一个 web 应用,除非页面极少的情况下,可以使用纯静态 HTML ,正常情况下都是使用 PHP 或者 JAVA 这种动态语言来实现。

如果你使用过域名的话,因为网站搬家或者更换域名,你可能要使用到域名的 301 ,302 跳转,这些都是基于 HTTP 标准协议所产生的。

二:环境的安装(Window 和 Linux)

首先要保证 apche 开启了 mod_rewrite 模块,在 apche 配置文件的 httpd.conf 文件中,Wamp 是默认开启的。

当眼在常见的 LAMP 或者 宝塔等集成 web 环境中,一般都是默认开启的。

扫描二维码关注公众号,回复: 6046934 查看本文章

 三:第一个例子

如果是在 httpd.conf 中修改,需要每次完成都要重启 apche ,但是 apche 提供了一个不需要重启的解决方案,那就是需要在使用的网站目录下,建立 .htaccess 文件,注意 Window 请使用命令行来创建。

第一个 .htaccess 例子:

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

例子演示了当你访问 xxx.com/xx.htm 时,服务器真正的请求是在 xxx.com/xx.html

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

1:通过 .htaccess,针对每个目录,并且作用于所有子目录,大访问会存在性能瓶颈,生产生环境建议部署到主配置文件当中,但是在有些虚拟主机没有权限时使用是一个很好的解决方法。

2:通过 Apache 的主配置文件 <Directory> 段中来实现,将 AllowOverride 设置为 None,然后下面编写,每次记得重启

AllowOverride None
RewriteEngine On
RewriteRule ^(.*)\.htm$ $1.html

3:使用 php 或者其他语言脚本,比如 php 中的 header() 方法,只能外部实现。

五:apache 重定向原理

 六:mod_rewrite 简介

Apache的URL操作模块,包含 RewriteBase,RewriteRule,RewriteCond,RewriteMap

重定向原理:

1、apache收到一个url请求

2、判断是否开启了Rewrite模块,没有就直接访问服务器资源

3、有的话就进入第一条RewriteRule,检查是否能匹配上,匹配到的话就检查这条RewriteRule上面有没有RewriteCond,没有的话就进行替换,把url重定向,进入下一条RewriteRule

4、如果RewriteRule(1)之上有RewriteCond的话,就要先判断是否满足该条RewriteCon

七:rewrite 错误日志配置,在 httpd.conf 中配置

 八:rewrite_rule 规则的说明:

 

301 永久重定向,SEO 会将搜索引擎的评分传递给重定向的域名。302 临时重定向。

加 R 标签的话,默认为 302 重定向,转向的地址,相对的话记得以 '/' 开头

RewriteEngine on

RewriteRule ^(.*)\.htm$ /$1.html [C]
RewriteRule ^(.*)\.html /$1.php

变成了一个整体,只有第一条生效,第二条才跟着生效。

 

 

RewriteEngine on
RewriteRule ^(.*)\.htm /index.html#$1 [R,NE]

有时候我们需要跳转到锚点链接,就需要用到这个了

如果不加NE,会跳转到:
http://write.test/index.html%23index

RewriteRule ^Test/(.*)\.htm /tmp/$1.htm [NC]

如果不加NC的话,会跳转到/Test/xx.htm,就是匹配规则失败

G 标签主要用于下载等资源链接,有一定有效期的。 

RewriteEngine on

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

#不加 ASA 访问
#http://write.test/per/index.php?name=popo
#变成:http://write.test/per.php?url=index.php

#加上 QSA
#访问
#http://write.test/per/index.php?name=popo
#变成:http://write.test/per.php?url=index.php&name=popo

 

RewriteEngine on

RewriteRule ^(.*)\.htm $1.html

如果不加 R 的话,访问以上没有问题
http://write.test/aa.htm  -> The requested URL /aa.html was not found on this server.

RewriteRule ^(.*)\.htm $1.html [R]
如果加上 R 标签变为外部放问的话,路径就出现问题了

http://write.test/aa.htm  -> to access /D:/wamp64/www/write/aa.html on this server.

如果不使用 RewriteBase 的话可以通过如下解决:
加上 '/' 表示相对路径
RewriteRule ^(.*)\.htm /$1.html [R]

RewriteBase 使用目录级的重写,默认到哪个路径下面去找

RewriteBase /
RewriteRule ^(.*)\.htm $1.html [R]

 

RewriteCond $1 "test"
RewriteRule ^(.*)\.htm $1.html [R]

意思自由在满足,变量为字符串 test 的时候才使用规则

 

RewriteEngine on

RewriteCond %{HTTP_HOST} "127.0.0.1"
RewriteRule ^(.*)\.htm http://localhost/$1.html [R]

可用变量见上图,以上效果等于,当用户输入
http://127.0.0.1/test.htm

变为http://localhost/test.html

RewriteEngine on

RewriteCond %{HTTP_HOST} "127.0.0.(.*)"
RewriteCond %1 "1"
RewriteRule ^(.*)\.htm http://localhost/$1.html [R]

当只有服务器变量匹配满足时,才生效

 

 

猜你喜欢

转载自blog.csdn.net/myarche/article/details/89631523
今日推荐