伪静态

来源:互联网 发布:mac进不去系统 编辑:程序博客网 时间:2024/05/16 06:36
伪静态的使用和方法
首先我们要了解伪静态是什么?
伪静态就是把动态的url地址转化成类似静态的url地址 ,也就是说本质还是动态页面。
这里注意一点,静态是通过缓存生成html页面,伪静态则不会生成缓存,伪静态只是单纯的地址变化。
例如当我们平时写动态网页的时候,我们通常会以 '?' 以及 '&' 来进行传参
http://www.newlist.php?name=2&id=3
我们要改成如下格式:
http://www.newlist.php/2/3.html
通过上面两个地址的变化可以看出,我们省略了 '?' '&' ,而是用 '/',以及参数后缀用 '.html' ,这就是典型的伪静态格式。
伪静态是做什么的?
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用PHP和ASP一类的动态脚本来处理的。
伪静态有什么好处?
1.最主要的就是为了搜索引擎方便搜索引擎蜘蛛(Spider)来抓取网页上的相关内容;
2.影响网站在搜索引擎的排名中,有很重要的一条是网页静态化,很多朋友在研究SEO的时候,因为有些技术原因,伪静态成了最大的门槛;
(SEO是什么?)
SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”。SEO是指通过站内优化比如网站结构调整、网站内容建设、网站代码优化等以及站外优化,比如网站站外推广、网站品牌建设等,使网站满足搜索引擎收录排名需求,在搜索引擎中提高关键词排名,从而吸引精准用户进入网站,获得免费流量,产生直接销售或品牌推广。
伪静态对于SEO的意义重大,真正的静态页面空间储存量大,进行删除或者更新这些html文件时可造成大量文件碎片,破坏磁盘环道,而伪静态可以更好的缓解服务器的压力,增强搜索引擎对页面的收录;
动态页面虽然可以实时更新,但是有时会导致死循环,对搜索引擎不友好,而伪静态却不会出现这种情况。
3.提高用户对网页的信任度;
那么关于网页做成伪静态的缺点有哪些?
首先,使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷,可能将导致硬盘损坏并将影响网站性能,进而影响到网站的正常运营。
那么我们该如何选择伪静态还是真静态呢? 我们可以根据自己网站的特点参考以下几点,
1、使用真静态和假静态对SEO来说没有什么区别
2、使用真静态可能将导致硬盘损坏
3、使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷,所以当我们使用伪静态的时候不能大量访问
总的来说,最重要的一点,不管是真静态还是伪静态我们都是为了网站优化(SEO)。
设置伪静态
我们可以使用两种方法:
1.通过php代码实现伪静态:
在开始代码之前,我首先要明白我们的参数在测试的时候是自己手动输入的,就像下面的例子一样,我们首先要创建一个new.php,当我们用$_SERVER打印这个空网页的时候,没有PATH_INFO的值。并非创建一个new.php/2/1.html,创建成功之后在地址栏里加上/2/1.html,这时候PATH_INFO就是你所写的html形式的参数。
<?php header('content-type:text/html;charset=utf-8');//打印一下服务器变量$_SERVER,找到PATH_INFO //print_r($_SERVER); //若我么的PHP地址为 http://www.newlist2.com/new.php/2/1.html //我们要匹配2/1.html //preg_match 匹配正则 preg_match('/^\/(\d+)\/(\d+).html$/',$_SERVER['PATH_INFO'],$arr); //打印一下 //print_r($arr); //假设我们传的两个参数分别为g_id和c_id的值,也就是2/1.html的值 $g_id = $arr[1]; $c_id = $arr[2];
?>
2.通过配置虚拟域名来实现伪静态
Apache服务器配置网站伪静态
1 、什么是网站的伪静态?
伪静态简而言之就是假静态,当输入 URL 的时候访问的是 .html 或者 .htm 结尾的文件,其实访问的依旧是 .php 文件,过程就是进行 URL 的重
2 、伪静态有什么好处?
个人认为:伪静态相对于纯静态来说,不用生成静态文件,只需要写正则匹配 URL 路由即可,搜索引擎喜欢静态文件,那么伪静态正好投
其所好
3 、伪静态如何配置?
我们采用建立 .htaccess 文件的形式,来展示网站路由的伪静态技术,实现步骤如下:
① 打开 Apache 的配置文件 httpd.conf ,找到:
#LoadModule rewrite_module 将前面的 # 去掉 表示开启 url 重写模式
② 找到虚拟主机的配置项:
<VirtualHost *:80>
ServerName www.lipeng.com
documentRoot c:/lipeng
</VirtualHost>
<Directory "c:/lipeng">
Options Indexes FollowSymLinks
AllowOverride None 改为 AllowOverride All 表示 本网站允许进行域名重定向
Order allow,deny
Allow from all
</Directory>
③ 重启 Apaache
④ 在你的网站入口文件,也就是根目录下建立一个 .htaccess 文件,该文件比较特殊,没有文件名,建立方式如下:
a) 先用记事本建立一个文本文档
b) 然后双击打开,选择文件另存为,如下效果图:

c) 另存为的时候该一下文件名:画红圈的地方要注意看

⑤ 然后打开这个 .htaccess 文件,写入你的重写规则:
第一行一定要写: RewriteEngineon 注释:这一句话是开启重写模式规则
第二行接着写重写的正则表达式:
RewriteRule([a-zA-Z]{1,})-([a-zA-Z0-9]{1,}).html$ /index.php?controller=$1&action=$2
这个正则什么意思呢?我给你一一解释一下:
RewriteRule :代表的是从这开始就是重写规则了
([a-zA-Z]{1,}) : : 是第一个正则,也就是说你要请求的一个参数
例如: www.baidu.com/index.php?controller=User&&Action=add 那么上面的第一个正则将代表 controller= 右边的值
- : : 代表的是参数之间的连接标示符 可以用其他的标示符,注意一定要是正则能认识的标示符
([a-zA-Z0-9]{1,}) : : 是第二个正则,也就是说你要请求的二个参数
例如: www.baidu.com/index.php?controller=User&&Action=add 那么上面的第一个正则将代表 Action= 右边的值
.html : : 代表的是你要重写后的文件后缀名,我们重写后以静态文件 .html 的形式展示
$ :代表重写的正则结束
紧接着一定要有一个空格,后面开始写你要匹配的字符串也就是 URL
index.php?controller=$1&action=$2 : : 代表你的原始 URL , $1 就会匹配你的第一个正则, $2 就会匹
配你的第二个正则
伪静态实例:
例如:我现在在 C 盘更目录下建立一个文件夹叫做: lipeng ,作为我网站的根目录
紧接着,我在根目录下写一个 .htaccess 文件,内容如下:
RewriteEngine on
RewriteRule ([a-zA-Z0-9]{1,})-([a-zA-Z0-9]{1,}).htm$ /admin.php?name=$1&age=$2
那么上面的正则是什么意思呢?就是我在浏览器的地址栏里写一个: : http://www.lipeng.com/zhangsan-10.htm
那么这个地址就会去访问到我的 admin.php 文件,因为重写的规则就是指向 admin.php 的,并且 zhangsan-10.htm 中的 zhangsan ,我
可以在 admin.php 里通过 $_GET['name'] 得到这个值,还可以通过 $_GET['age'] 得到 10 这个值,因为我的正则规则就是:值 1- 值 2. 文
件后缀名
====================================================
  • 一、准备开始:mod_rewrite
  • 二、利用.htaccess实现URL重写(rewrite)与URL重定向(redirect)
    1. 将.htm页面映射到.php
    2. 临时重定向(R=302)与永久重定向(R=301)
    3. 为什么要用重定向?——重定向和URL重写的区别
    4. 长短地址转换
    5. 去掉www
    6. 加上www
    7. 支持多域名访问
  • 三、改写查询字符串QUERY_STRING
    1. 利用QSA转换查询字符串QUERY_STRING
    2. 利用RewriteCond改写查询字符串QUERY_STRING
    3. QSA与RewriteCond双剑齐发
    4. 剥离查询字符串
  • 四、利用RewriteCond和RewriteRule进行访问控制
    1. 文件访问控制
    2. 用.htaccess阻止User-agent
    3. 用.htaccess阻止盗链(hot-linking)
  • References

URL重定向是.htaccess的重头戏,它可以将长地址转为短地址、将动态地址转为静态地址、重定向丢失的页面、防止盗链、实现自动语言转换等。笔者觉得难点是在正则表达式的运用和理解上。有关htaccess的正则表达式用法,请查阅本站《.htaccess正则表达式》一文。
一、准备开始:mod_rewrite
实现所有这些神奇功能的模块叫做mod_rewrite,请确保你的服务器安装并启用了该模块:
sudo a2enmod rewrite
我们一般会把所有涉及URL重写或者重定向的代码这样放置:
<IfModule mod_rewrite.c> # Turn on rewrite engine Options +FollowSymlinks RewriteEngine on # More rules below ...</IfModule>
一些我们需要注意的地方:
  • FollowSymlinks必须启用,这是rewrite引擎的安全需求。
  • 通常FollowSymlinks在Apache的主配置文件中就已经启用了,所以通常可以省略。
  • RewriteEngine命令用于启用rewrite引擎
  • IfModule命令用于判断Apache是否安装了mod_rewrite模块,之后笔者会省略该命令,但不代表这是个好习惯。
  • mod_rewrite会处理所有提交给Apache的URL请求,并与之后的规则进行匹配
下面我们开始讲解一些例子。
二、利用.htaccess实现URL重写(rewrite)与URL重定向(redirect)
1.将.htm页面映射到.php
Options +FollowSymlinksRewriteEngine onRewriteRule ^(.*)\.htm$ $1.php [NC]
注意事项:
  • 该RewriteRule能够将.htm静态页面映射到.php动态页面
  • 如果通过.htm进入,浏览器地址栏显示的是.htm扩展名,但服务器上实际执行的是.php
  • 必须保证服务器上有对应的.php,否则会404
  • 浏览器和搜索引擎可以同时通过.htm和.php访问网页
  • 如果该目录上存在.htm,将被忽略
  • [NC]表示“不区分大小写”,更多类似定义请参考本站《.htaccess正则表达式》一文
2.临时重定向(R=302)与永久重定向(R=301)
RewriteEngine onRewriteBase /RewriteRule ^(.*)\.htm$ $1.php [R,NC,L]
注意事项:
  • 该RewriteRule能够将.htm静态页面重定向到.php动态页面
  • 如果通过.htm进入,浏览器地址栏会自动转为.php,这也是重定向的本质
  • 必须保证服务器上有对应的.php,否则会404
  • 浏览器和搜索引擎可以同时通过.htm和.php访问网页
  • 如果该目录上存在.htm,将被忽略
  • RewriteBase定义了重写基准目录。
  • 例如,如果你将虚拟站点设置在/var/www目录下,删除这行将会导致重定向到http://yourdomain.com/var/www/1.php。显然这是找不到的,而且你也不会希望用户看见你的服务器的目录结构。
  • 再举个例子,如果RewriteBase /base/,那么将会重定向到http://yourdomain.com/base/1.php。
  • 对于重写基准目录,我们还可以通过将$1.php变成/$1.php实现直接变换,这时就可以将RewriteBase省略。
  • 字母R表示临时重定向,相当于[R=302,NC]。关于重定向代码,请参考本站《HTTP协议重定向编码
  • 字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则。
在讨论R=302临时重定向后,理解R=301永久重定向也就容易多了:
RewriteEngine onRewriteRule ^(.*)$ http://newdomain.com/$1 [R=301,NC,L]
  • 这个规则告诉浏览器和搜索引擎,网站地址发生了永久性变更,用户的URL请求将会被发送给新的域名(主机)处理。
  • 由于是重定向到新的主机地址,RewriteBase也就没有出现的必要了。
3.为什么要用重定向?——重定向和URL重写的区别
  • 通过重定向,浏览器知道页面位置发生变化,从而改变地址栏显示的地址
  • 通过重定向,搜索引擎意识到页面被移动了,从而更新搜索引擎索引,将原来失效的链接从搜索结果中移除
  • 临时重定向(R=302)和永久重定向(R=301)都是亲搜索引擎的,是SEO的重要技术
  • URL重写用于将页面映射到本站另一页面,若重写到另一网络主机(域名),则按重定向处理
4.长短地址转换
利用URL重写,我们可以很方便地实现长短地址的转换,但是用重定向就不合适了。
RewriteEngine OnRewriteRule ^grab /public/files/download/download.php
若访问
http://mysite/grab?file=my.zip
则会执行该页面:
http://mysite/public/files/download/download.PHP?file=my.zip
5.去掉www
Options +FollowSymlinksRewriteEngine onRewriteCond %{HTTP_HOST} ^www\.(.*) [NC]RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
6.加上www
RewriteEngine OnRewriteCond %{HTTP_HOST} ^(.*)$RewriteRule (.*) http://www\.%1/$1 [R=301,L]
7.支持多域名访问
如果你不凑巧买到了不支持多域名的主机,那么.htaccess或许可以帮助你。现在假设你有域名domain-one.com和domain-two.com,并且在服务器根目录有对应文件夹one和two,那么通过下面的改写就能让Apache同时接受者两个域名的请求:
#two domains served from one root..RewriteCond %{HTTP_HOST} domain-one.comRewriteCond %{REQUEST_URI} !^/oneRewriteRule ^(.*)$ /one/$1 [L]RewriteCond %{HTTP_HOST} domain-two.comRewriteCond %{REQUEST_URI} !^/twoRewriteRule ^(.*)$ /two/$1 [L]
三、改写查询字符串QUERY_STRING
查询字符串是指URL请求中“问号”后面的部分。比如,http://mysite/grab?foo=bar中粗体部分就是查询字符串,其中变量名是foo,值是bar。
1.利用QSA转换查询字符串QUERY_STRING
QSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的:
RewriteEngine OnRewriteRule /pages/(.+) /page.php?page=$1 [QSA]
  • 将会把请求/pages/123?one=two 映射到 /page.php?page=123&one=two
  • 注意粗体部分几乎是相同的,除了“问号”变成了“与”符号
  • 如果没有QSA标志,那么会映射到/page.php?page=123。
  • 如果没有用到小括号正则表达式,就不需要QSA,这在上节“长短地址转换”中已经例证过了。
  • 小括号正则表达式可以截取查询字符串中的内容,但是如果没有开启QSA标志,那么在/page.php?page=$1中“问号”之后将会被剥离丢弃。这种特性可以用于实现“剥离查询字符串”
通过QSA,我们可以将简单链接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link
RewriteEngine OnRewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
2.利用RewriteCond改写查询字符串QUERY_STRING
RewriteEngine OnRewriteCond %{QUERY_STRING} foo=(.*)RewriteRule ^grab(.*) /page.php?bar=%1
  • 该规则将访问请求http://mysite/grab?foo=bar转换为http://mysite/page.php?bar=bar
  • RewriteCond用于捕获查询字符串(QUERY_STRING)中变量foo的值,并存储在%1中
  • QUERY_STRING是Apache定义的“变量=值”向量(数组)
3.QSA与RewriteCond双剑齐发
RewriteEngine OnRewriteCond %{QUERY_STRING} foo=(.+)RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
  • 会把/grab/foobar.zip?level=5&foo=bar 映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar
  • 转换后根目录是bar目录
  • foobar.zip?level=5中的“问号”变成了foobar.zip&level=5中的“与”符号
4.剥离查询字符串
只需在要开始剥离的链接后面加个“问号”,并且不要启用QSA标志,就可剥离查询字符串
RewriteEngine On# Whatever QS isRewriteCond %{QUERY_STRING} . # I don't want it with Question markRewriteRule foo.php(.*) /foo.php? [L]
四、利用RewriteCond和RewriteRule进行访问控制
我们在第一篇.htaccess基础中提到了很多有用的访问控制方法,其实通过Rewrite也能实现类似的功能,而且可以更强大!
1.文件访问控制
之前利用Order、Files及FilesMatch命令实现的访问控制可以满足大部分要求,但是当用户被拒绝时,他们看到的是硕大的“403 Forbidden”,如果你不想伤害用户的感情,就需要显示一些别的东西,通过Rewrite就可以实现这个特性:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !^(.+)\.css$RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$RewriteCond %{REQUEST_FILENAME} !special.zip$RewriteRule ^(.+)$ /chat/ [NC]
  • 该规则将仅允许用户请求.css, .js类型的文件,还有special.zip文件
  • RewriteRule 后面指定了限制规则:映射到/char/目录下处理
  • RewriteCond 后面的“感叹号”(!)起到了“否定”作用,它表明,对不满足后面正则表达式者应用RewriteRule规则,也就是对当前类型的文件将不应用规则
  • RewriteCond 之间是以逻辑“与”连接的,也就是只有当三个条件都不满足时才执行RewriteRule
  • 该规则也会限制访问.htm, .jpg等格式
  • 该规则不可以放在虚拟站点根目录(/)下,否则会死循环
  • 如果是二级目录,如/test/,那么传入RewriteCond的参数是以/test/开始的,因此从(.+)获得的文件名也含有/test/,读者必须对此多加小心
  • 要想仅获得文件名,可以将(.+)替换成([^/]+),并且去掉符号^,如下所示:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !([^/]+)\.css$RewriteCond %{REQUEST_FILENAME} !([^/]+)\.js$RewriteRule ^(.+)$ /chat/ [NC]
2.用.htaccess阻止User-agent
什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是所有HTTP客户端都得用User-agent向服务器“自报家门”,以便服务器对不同的客户端作出不同响应。比如,某站点可能需要对浏览器、搜索引擎crawl还有各类下载工具作出不同的响应。服务器就是通过所谓的User-agent进行区分的。
如果你的服务器提供某些资源的下载,那么你就必须多加小心诸如“迅雷”等下载软件,因为它们可能把你网站资源吸干,并且影响你的正常访客访问。为此,我们可以利用Rewrite限制某些UA的访问:
RewriteEngine onRewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC]RewriteRule . abuse.txt [L]
  • 该规则限制“迅雷”客户端下载资源,并将下载文件重置到abuse.txt
  • HTTP_USER_AGENT是Apache的内置变量
  • 2.0.50727是迅雷User-agent的特征字符串
  • RewriteRule后面的“点”表示“任意URI”,也就是不管请求的是什么,都输出abuse.txt
通常,我们不会仅限制一个UA。利用[OR]即可实现对多个UA作出统一处理:
RewriteEngine onRewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]# etc..RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC]RewriteRule . abuse.txt [L]
3.用.htaccess阻止盗链(hot-linking)
盗链,特别是图片,是非常可耻的!哪怕将图片复制到自己服务器上,也比盗用他人的图片链接来得光彩!(吐糟完毕)
.htaccess的Rewrite功能可以提供非常简单、有效的方法阻止这种可耻行为:
RewriteEngine OnRewriteCond %{HTTP_REFERER} !^$RewriteCond %{HTTP_REFERER} !^http://(www\.)?lesca\.me/ [NC]RewriteCond %{REQUEST_URI} !hotlink\.png [NC]RewriteRule .*\.(gif|jpg|png)$ /hotlink.png [NC]
原创粉丝点击