伪静态

伪静态

一、先说什么是SEO

SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”。SEO是指通过站内优化比如网站结构调整、网站内容建设、网站代码优化等以及站外优化来提高搜索引擎的排名

关于SEO,严谨的定义如下:SEO是指在了解搜索引擎自然排名机制的基础之上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键词的自然排名,获得更多的展现量,吸引更多目标客户点击访问网站,从而达到互联网营销及品牌建设的目标。搜索引擎检索原则是不断更改的,检索原则的更改会直接导致网站关键字在搜索引擎上排名的变化,所以搜索引擎优化并非一劳永逸

二、什么是伪静态

伪静态又名:URL重写的一种。只是把URL改成静态形式,实际上还是动态网页 但是搜索引擎喜欢。伪静态有着真静态一样的SEO

 
www.jack.com/info_100.html
//vs
www.jack.com/info.php?id=100
# 地址重写
www.jack.com/i/?user_id=123&time=123&from=web
//vs
www.jack.com/i/123/123/web
 

三、地址重写(Rewrite)

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。如果要想用到rewrite模块,必须先安装或加载rewrite模块

  • 安装web服务器(apache/nginx)
  • 加载mod_rewrite.so模块
    #Apache  httpd.conf
    LoadModule rewrite_module modules/mod_rewrite.so        //取消注释开启

     

地址重写的实现方式(主要有3种)

  1. 通过配置WEB服务器主配置<DIRECTORY> (生产环境)
     
    NameVirtualHost *:80
    <VirtualHost *:80>
    DocumentRoot "D:/wamp/www/testphp/"
    ServerName www.aipanshi.com
    ServerAlias aipanshi.com #可省略
    ServerAdmin 376927050@qq.com #可省略
    ErrorLog logs/dev-error.log #可省略
    CustomLog logs/dev-access.log common #可省略
    ErrorDocument 404 logs/404.html #可省略
    <Directory "D:/wamp/webs/aipanshi.com/">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    </Directory>
    </VirtualHost>
    • 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> 
  2. 通过.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] 不匹配字符串:chars
  • text1|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]的规则与下条规则成为一个整体,第一条不匹配,那么下一条就不进入
    #url 
    ​
    http://www.test.com/class-3.htm
    #.htaccess
    ​
    RewriteEngine on
    RewriteRule ^/?(.*)\.html$ /src/$1.htm  [C]
    RewriteRule ^/?(.*)\.htm$ /src2/$1.php
     
     
  • L (last) 停止匹配后面的规则,如果有多条规则的话,当加[L]的规则匹配后,则停止后面规则的匹配
     
     
    # http://www.test.com/123.html
    ​
    RewriteEngine on
    RewriteRule ^(.*)\.html  jack.html    [L]
    RewriteRule ^(.*)\.html  jack_shuaishuai.php
    # http://www.test.com/123.html
    ​
    RewriteEngine on
    RewriteRule /([0-9]+).html /test1.php?id=$1 [L]
    RewriteRule /(.*) /test2.php?id=$1

     

  • 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

 

 
 
posted @ 2020-07-01 22:10  成文的博客  阅读(610)  评论(0编辑  收藏  举报