伪静态
一、先说什么是SEO
SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”。SEO是指通过站内优化比如网站结构调整、网站内容建设、网站代码优化等以及站外优化来提高搜索引擎的排名
关于SEO,严谨的定义如下:SEO是指在了解搜索引擎自然排名机制的基础之上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键词的自然排名,获得更多的展现量,吸引更多目标客户点击访问网站,从而达到互联网营销及品牌建设的目标。搜索引擎检索原则是不断更改的,检索原则的更改会直接导致网站关键字在搜索引擎上排名的变化,所以搜索引擎优化并非一劳永逸
二、什么是伪静态
伪静态又名:URL重写的一种。只是把URL改成静态形式,实际上还是动态网页 但是搜索引擎喜欢。伪静态有着真静态一样的SEO
三、地址重写(Rewrite)
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。如果要想用到rewrite模块,必须先安装或加载rewrite模块
- 安装web服务器(apache/nginx)
- 加载mod_rewrite.so模块
#Apache httpd.conf LoadModule rewrite_module modules/mod_rewrite.so //取消注释开启
地址重写的实现方式(主要有3种)
- 通过配置WEB服务器主配置
<DIRECTORY>
(生产环境)
ErrorDocument
这里填 403,404等错误信息调整页面,用来访问出现404页面等情况时的错误页面展示,比较有用,也可以不要。注意:/404.html 这个文件路径是项目的根目录,不是apache的目录Options Indexes FollowSymLinks
这是来设置是否来显示文件根目录的目录列表
变成:Options FollowSymLinks
不允许查看目录结构- 优先显示index.php还是index.html
Apache httpd.conf<IfModule dir_module> DirectoryIndex index.html index.htm index.php index.php3 </IfModule>
- 通过.htaccess (开发环境)
- 第一步:在apache主配置文件(httpd.conf)里配置allowOverride All(开启)
- 第二步:生成htaccess文件(window下借助rename)
- 第三步:在
.htaccess
文件里配置
RewriteEngine on RewriteRule ^(.*)\.html$ $1.php //匹配html改成php
四、mod_rewrite语法说明
1、 Rewrite规则表达式的说明
.
匹配任何单字符[chars]
匹配字符串:chars[^chars]
不匹配字符串:charstext1|text2
可选择的字符串:text1或text2?
匹配0到1个字符*
匹配0到多个字符+
匹配1到多个字符^
字符串开始标志$
字符串结束标志\n
转义符标志- 反向引用
$N
用于 RewriteRule 中匹配的变量调用(0 <= N <= 9) - 反向引用
%N
用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)
2、RewriteRule语法说明
RewriteRule 匹配模式 替换的URL [flags]
- 匹配模式支持Prel格式的正则表达式
- 替换的URL支持匹配模式的结果与rewrite变量
- 多个flags用逗号隔开(例如:[R=301,C])
3、RewriteRule flags说明
- R (redirect) 强制外部重定向,浏览器地址栏url会发生变化,301永久重定向,302临时重定向,例子:[R=301],R
RewriteEngine on #RewriteRule ^(.*)\.html$ /src/$1.php [R=302] RewriteRule ^(.*)\.html$ /src2/$1.php [R=301] //301永久重定向 搜索引擎信息完全转换 // 加R直接跳转哦
R=307解决post数据丢失
- C (chain) 链接下一条规则,如果有多条规则的话,则当前加[C]的规则与下条规则成为一个整体,第一条不匹配,那么下一条就不进入
- L (last) 停止匹配后面的规则,如果有多条规则的话,当加[L]的规则匹配后,则停止后面规则的匹配
- NE (noescape) 不对URL的特殊字符进行转义
RewriteEngine on RewriteRule ^/?(.*)\.html$ /index.php#$1 [R,NE]
- NC (nocase) 不区分大小写
# url http://www.test.com/jack/abc.html http://www.test.com/Jack/abc.html #htaccess RewriteEngine on RewriteRule ^jack/(.*)\.html$ /src/$1.php
- G (gone) 请求的网页失效,服务器返回410 强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了
RewriteEngine on RewriteRule ^test/(.*)$ / [G]
可以在配置文件里配置410页面
ErrorDocument 410 /missing.html
- QSA (qsappend) 用于在url中截取查询字符串 Apache默认地址上不显示
RewriteEngine on RewriteRule ^t/(.*)$ /search.php?keyword=$1 [R,QSA]
4、RewriteBase
设置了目录及重写的基准URL
RewriteEngine on RewriteBase /my RewriteRule ^test/(.*)$ search.php?keyword=$1 [R,QSA]
5、RewriteCond
RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句
RewriteEngine on RewriteBase /my RewriteCond %{HTTP_HOST} www.test.com #声明Client请求的主机中前缀是www.test.com,则执行下面的RewroteRule语句 RewriteRule ^test/(.*)$ /123/$1.php [R,NC]
假如请求的文件或目录存在
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L] # 只作用上面一条规则。下面如果还有规则 就管不住了 #RewriteCond %{REQUEST_FILENAME} !-f //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写) #RewriteCond %{REQUEST_FILENAME} !-d //#如果目录存在就直接访问目录不进行RewriteRule
和if比较
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla\/5\.0.* RewriteRule index.php index.m.php RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule index.php index.L.php RewriteRule index.php index.b.php
等同于:
if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0') { //跳转到对index.m.php的访问 } else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx') { //跳转到对index.L.php的访问 } else //跳转到对index.b.php的访问
and和or
RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule (.*)$ test.php
# 上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。
五、一些实例
(1)将 index.php 伪静态成为 index.html
RewriteRule ^index\.html$ index.php
(2)将 news/info.php?id=3 伪静态成为 news/info_3.html
RewriteRule ^news/info_([0-9]{1,})\.html$ news/info.php?id=$1</pre>
(3)将 index.php?class_id=2&id=3 伪静态成为 2-3.html
RewriteRule ([0-9]{1,})-([0-9]{1,})\.html$ index.php?class_id=$1&id=$2
([0-9]{1,})-([0-9]{1,})\.html$
是规则,index.php?action=$1&id=$2
是要替换的url格式,$1
代表第一个括号匹配的值,$2
代表第二个,如此类推。
(4)将 tag.php?tag=php教程
或者 tag.php?tag=程序员
伪静态成为 tag/php教程
和 tag/程序员
RewriteRule ^tag/(.*)$ tag.php?tag=$1
(5)设置 404 跳转
ErrorDocument 404 http://www.smsyun.com/404.html