• 伪静态与重定向--RewriteRule


    环境:windows 10,phpstudy,sublime text。服务器使用Apache,网站根目录为E:phpstudywww,所以.htaccess放在www目录下。

    RewriteRule语法说明:

    RewriteRule  模式匹配  替换的URL  [flags]

    模式匹配使用perl语言的正则表达式语法,同时还可以使用一些rewrite预定义的变量

    替换的URL支持模式匹配的结果和rewrite变量

    多个flag用逗号隔开

    例子1

    此时根目录只有index.htm,将所有访问 *.htm的请求都重定向到  *.html

    1
    2
    3
    RewriteEngine On
    RewriteRule ^(.*).htm$ $1.html
    # $1在正则表达式中表示前面第一个匹配的子表达式,即.*部分 

      注意配置中的RewriteEngine On表示开启重写,注意请求的URL是 index.htm ,重定向到index.html,但是地址栏仍然为index.htm

     如果在根目录创建一个index.html文件,再刷新的话,结果就不同了:

    RewriteRule R flag说明

    R表示强制外部重定向,后面可以加301(永久重定向)或者302(暂时重定向)跳转,不加默认302(暂时重定向),加了R flag之后,地址栏的URL会改变

    这两种重定向的区别在于:SEO搜索引擎对网站是有评分的,如果使用临时重定向,则不会将搜索引擎对以前URL的评分 给 临时重定向(新的)的网站URL,会为新的URL产生一个新的评分;而永久重定向则会将评分转给新的URL。

    使用示例:

      此时根目录为空,仍旧访问localhost/index.htm

    1
    2
    3
    4
    RewriteEngine On
    RewriteRule ^(.*).htm$ $1.html [R]
    #等价于下面这一条
    #RewriteRule ^(.*).htm$ $1.html [R=302]

    注意上面的图片中,外部重定向时,地址栏的URL发生了改变,并且是按照磁盘的路径去查找,而不是按照网站根目录去查找,这时可以在$1前面加一个斜线 / ,表示重定向的基地址为网站根目录,如下例:

    1
    2
    3
    4
    RewriteEngine On
    RewriteRule ^(.*).htm$ /$1.html [R]
    #等价于下面这一条
    #RewriteRule ^(.*).htm$ /$1.html [R=302]

    创建index.html文件,再访问localhost/index.htm

    RewriteRule C flag说明

    C表示链接下一规则,如果在一条规则后面加了该flag后,这条规则就和下一条规则成为一个整体,如果这一条规则不匹配,那么下一条也不进行匹配,类似于“拉着别人下水的”的情景。

    注意这里的匹配的时候,前一条的匹配之后,URL改变了,然后,将新的URL进行下一条规则的匹配。

    实例:

      网站根目录下只有index.html和index.php文件,

    1
    2
    3
    RewriteEngine On
    RewriteRule ^(.*).htm$     /$1.html [C]
    RewriteRule ^(.*).html$    /$1.php

      现在结果如下图:

    而如果直接访问index.html,那么因为不匹配第一条规则,所以不进行第二条规则匹配,不会重定向到index.php,会直接输出index.html的内容。

    RewriteRule L flag说明

    如果一条规则的后面添加了这个L flag,那么如果这条规则匹配,就不在进行下一条规则的匹配,如果改规则不匹配,则会继续进行下一规则的匹配。

    实例:

      根目录下有index.html,index.php,访问index.htm,因为匹配到了第一条规则,并且后面有L flag,所以不会匹配下面一条

    1
    2
    3
    RewriteEngine On
    RewriteRule ^(.*).htm$     /$1.html [L]
    RewriteRule ^(.*).html$    /$1.php

      

    如果直接访问index.html,因为第一条规则没有匹配,那么会接着匹配第二条规则。

    RewriteRule NE flag 说明

    不对URL中的字符进行hexcode转码,比如我们传递一个参数,那么

    1
    2
    RewriteEngine On
    RewriteRule ^(.*).htm$     /index.html#$1  [R]

    访问localhost/index.htm

    可以看到#被转移成了十六进制的%23,加上NE参数

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

      

     RewriteRule NC flag说明

    NC是指在匹配时,不区分大小写。因为在Apache本身对大小写是敏感的,

    实例:

    1
    2
    RewriteEngine On
    RewriteRule ^index.htm index.html

    可以看到,并没有匹配第一条规则,因为此时是区分大小写的。加上NC之后,刷新:

    1
    2
    RewriteEngine On
    RewriteRule ^index.htm index.html [NC]

     RewriteRule G flag说明

    表示请求的网页已经失效(对应响应码的410),并且停止后续规则的匹配

    1
    2
    3
    RewriteEngine On
    RewriteRule .* - [G]
    #RewriteRule .* index.html

     RewriteRule QSA flag说明

    用于在URL中截取查询字段,也就是保留用URL传递的参数,因为默认是会将参数截取掉的

    1
    2
    RewriteEngine On
    RewriteRule ^per/(.*)$ /per.php?url=$1 [R]

      访问localhost/per/index.htm?id=5

    如果没有QSA字段,传递的id=5被截取掉了。如果加上QSA字段:

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

      再次访问localhost/per/index.htm?id=5

    加油!!!!!
  • 相关阅读:
    Luogu P2495 [SDOI2011]消耗战
    40. Combination Sum II
    39. Combination Sum
    22. Generate Parentheses
    51. N-Queens
    Codeforces Round #346 (Div. 2) E. New Reform
    Codeforces Round #346 (Div. 2) D. Bicycle Race
    HDU 5651xiaoxin juju needs help
    VK Cup 2016
    Educational Codeforces Round 10 D. Nested Segments
  • 原文地址:https://www.cnblogs.com/apolloren/p/9114714.html
Copyright © 2020-2023  润新知