zoukankan      html  css  js  c++  java
  • apache .htaccess 伪静态重定向,防盗链 限制下载...

    301全站跳转

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.old.net$ [NC]
    RewriteRule ^(.*)$ http://www.new.net/$1 [L,R=301,NC]

    其中 http://不能省略,不然出现绝对路径加在跳转重写前面的

    .htaccess 正则表达式
    # 位行首表示注释
    [F] Forbidden (禁止):
        命令服务器返回403 Forbiden 错误给用户浏览器

    [L] Last rule (最后一条规则)
        告诉服务器在本条规则执行完后停止重写URL

    [N] Next (下一条规则)
        告诉服务器继续重写,指导所有重写指令都执行过

    [G] Gone (丢失)
        命令服务器返回410 GONE(no longer exists)错误消息

    [P] Proxy (代理)
        告诉服务器通过mod_proxy模块处理用户请求

    [C] Chain (捆绑)
        告诉服务器将当前的规则和前面的规则进行捆绑

    [R] Redirect(重定向)
        告诉服务器发出重定向消息,以便用户浏览器发出rewitten/modified(重写/修改) 请求

    [NC] No Case(不区分大小写)
        对客户端请求的URL不区分大小写

    [PT] Pass Through(放行)
        让mod_rewrite 模块将重写的URL传回给Apache做进一步处理

    [OR] Or(逻辑或)
        用逻辑“或”将两个表达式连接在一起,如果结果为“真”,则会应用后继的相关规定

    [NE] No Escape (禁止转义)
        命令服务器在输出时禁用转义字符

    [NS] No Subrequest(禁用子请求)
        如果存在内部请求,则跳过当前命令

    [QSA] Append Query String(追加查询字符串)
        命令服务器在URL末尾追加查询字符串

    [S=x] Skip(跳过)
        如果满足某指定条件,则跳过后面第X条规则

    [E = Variable:value](环境变量)
        命令服务器交将值 value赋给变量 variable

    [T=MIME-type] Mime Type (MIME 类型)
        声明目标资源所属的MIME类型

    []
      匹配一个字符集,如[xyz]可以匹配x,y或者z

    [^]
       如:[xyz]+ 会以任何顺序,次数匹配x,y,z的出现

    [a-z]
        连字符(-)表示匹配从字母a到z的所有字符串

    a{n}
        指定字母a出现的次数为N次,满足该条件时匹配。如x{3}仅与xxx匹配

    a{n,}
        指定字母a出现的次数至少为N次,例如X{3}可以与XXX或者xxxxx等级匹配

    a{n,m}
        指定a出现的次数至少为n到m次    

    ()
      用于将正则表达式分组,满足第一组正则表达式的字符串会被存储在变量$1中,以此类推。如果括号呈的不是正则表达式,例如(myname)?press 将能够匹配有或者没有myname前缀的press

    ^
     位于行首。注意:和中括号中的[^]意义不同

    $
     位于行末

    ?
      例如 world?会匹配world或者worldx,而如 wor(ld)? 会匹配wor或者world,又如:x?会匹配“空字符”或者一个x

    !
      逻辑非。例如:"!myname"将会匹配除了“myname”以外的所有字符串

    .
     表示任意字符

    -
     命令apache“不要”重写URL,例如:"xxx.domian.com.* -[F]"

    +
     匹配至少一个任意字符,例如:G+ 匹配以G开头,并且后面至少有一个字符的字符串

    *
     匹配零个或多个字符,例如:“。”匹配任意字符

    |
      逻辑“或”。与[OR]不同的是,它是匹配字符串,例如(x|y)匹配x或者y



      转义字符。可以转义左括号(,尖括号^,美元符号 $, 感叹号 !点 。 星号 *,管道符号|等,

    .
     转义为点字符(点字符在正则表达式中可以匹配任意字符)

    /*
      零个或多个字符

    .*
      零个或多个任意字符(即匹配任意字符,包括空字符)

    ^$
      匹配“空字符”,“空行”

    ^.*$
        匹配任意字符串(仅限一行)

    [^/.]
        匹配既非“正斜杠”也不是“点”的任意字符

    [^/.]+
        匹配第一个字符既非“正斜杠”也不是“点”,后继字符可以是“正斜杠”或者“点”字符串

    http ://
        匹配 http ://

    ^domain.*
        匹配以"domain"开始的字符串

    ^domain.com$
        仅匹配 "domain.com"

    -d
        测试字符串是否已存在的目录  

    -f
        测试字符串是否是已经存在的文件

    -s
        测试字符串所指文件是否有“非零”值

    以下为相关例子:
    1。将.htm 页面映射到 .php

    Options +FollowSymlinks
    RewriteEngine On
    RewriteRule ^(.*).htm$ $1.php [NC]

    2。临时重定向(R=302)与永久重定向(R=301)

    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.*).htm$ $.php [R,NC,L]
    •该RewriteRule能够将.htm静态页面重定向到.php动态页面
    •如果通过.htm进入,浏览器地址栏会自动转为.php,这也是重定向的本质
    •必须保证服务器上有对应的.php,否则会404
    •浏览器和搜索引擎可以同时通过.htm和.php访问网页
    •如果该目录上存在.htm,将被忽略
    •RewriteBase定义了重写基准目录。
    •例如,如果你将虚拟站点设置在/var/www目录下,删除这行将会导致重定向到h ttp://yourdomain.com/var/www/1.php 。显然这是找不到的,而且你也不会希望用户看见你的服务器的目录结构。
    •再举个例子,如果RewriteBase /base/,那么将会重定向到h ttp://yourdomain.com/base/1.php 。
    •对于重写基准目录,我们还可以通过将$1.php变成/$1.php实现直接变换,这时就可以将RewriteBase省略。
    •字母R表示临时重定向,相当于[R=302,NC]。关于重定向代码,请参考h ttp://lesca.me/archives/htaccess-appendix.html 《HTTP协议重定向编码》
    •字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则。

    永久得定向 R=301

    RewriteEngine On
    RewriteRule ^(.*)$ h ttp://newdomain.com/$ [R=301,NC,L]
    •这个规则告诉浏览器和搜索引擎,网站地址发生了永久性变更,用户的URL请求将会被发送给新的域名(主机)处理。
    •由于是重定向到新的主机地址,RewriteBase也就没有出现的必要了。

    3.为什么要用重定向?——重定向和URL重写的区别
    •通过重定向,浏览器知道页面位置发生变化,从而改变地址栏显示的地址
    •通过重定向,搜索引擎意识到页面被移动了,从而更新搜索引擎索引,将原来失效的链接从搜索结果中移除
    •临时重定向(R=302)和永久重定向(R=301)都是亲搜索引擎的,是SEO的重要技术
    •URL重写用于将页面映射到本站另一页面,若重写到另一网络主机(域名),则按重定向处理

    长短地址转换
    利用URL重写,我们可以很方便地实现长短地址的转换,但是用重定向就不合适了。

    RewriteEngine On
    RewriteRule ^grab /public/file/download/download.php

    若访问
    h ttp://mysite/grab?file=my.zip

    则会执行该页面:
    h ttp://mysite/public/files/download/download.php?file=my.zip

    去掉www

    options +FollowSymlinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.(.*) [NC]
    RewriteRule ^(.*)$ h ttp://$1/$1 [R=301,NC,L]

    加上www

    optionEngine On
    RewriteCond %{HTTP_HOST} ^(.*)$
    RewriteRule (.*) h ttp://www.%1/$1 [R=301,L]

    支持多域名访问
    如果你不凑巧买到了不支持多域名的主机,那么.htaccess或许可以帮助你。现在假设你有域名domain-one.com和domain-two.com,并且在服务器根目录有对应文件夹one和two,那么通过下面的改写就能让Apache同时接受者两个域名的请求:

    RewriteCond %{HTTP_HOST} domain-one.com
    RewriteCond %{REQUEST_URI} !^/one
    RewriteRule ^(.*)$ /one/$1 [L]

    RewriteCond %{HTTP_HOST} domain-two.com
    RewriteCond %{REQUEST_URL} !^/two
    RewriteRule ^(.*)$ /two/$1 [L]

    改写查询字符串QUERY_STRING
    查询字符串是指URL请求中“问号”后面的部分。比如,h ttp://mysite/grab?foo=bar ?部分就是查询字符串,其中变量名是foo,值是bar。
    1.利用QSA转换查询字符串QUERY_STRING
    QSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的:

    RewriteEngine On
    RewriteRule /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 On
    RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]

    利用RewriteCond改写查询字符串QUERY_STRING
    RewriteEngine On
    RewriteCond %{QUERY_STRING} foo=(.*)
    RewriteRule ^grab(.*) /page.php?bar=%1

    该规则将访问请求htt p://mysite/grab?foo=bar转换为htt p://mysite/page.php?bar=bar
    RewriteCond用于捕获查询字符串(QUERY_STRING)中变量foo的值,并存储在%1中
    QUERY_STRING是Apache定义的“变量=值”向量(数组)

    QSA与RewriteCond一起用

    RewriteEngine On
    RewriteCond %{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中的“与”符号

    剥离查询字符串

    只需在要开始剥离的链接后面加个“问号”,并且不要启用QSA标志,就可剥离查询字符串

    RewriteEngine On
    RewriteCond %{QUERY_STRING} .
    RewriteRule foo.php(.*) /foo.php? [L]

    用.htaccess阻止User-agent
    什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是所有HTTP客户端都得用User-agent向服务器“自报家门”,以便服务器对不同的客户端作出不同响应。比如,某站点可能需要对浏览器、搜索引擎crawl还有各类下载工具作出不同的响应。服务器就是通过所谓的User-agent进行区分的。
    如果你的服务器提供某些资源的下载,那么你就必须多加小心诸如“迅雷”等下载软件,因为它们可能把你网站资源吸干,并且影响你的正常访客访问。为此,我们可以利用Rewrite限制某些UA的访问:


    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^BlackWido [NC,OR]
    # ect...
    RewriteRule . abuse.txt


    •该规则限制“迅雷”客户端下载资源,并将下载文件重置到abuse.txt
    •HTTP_USER_AGENT是Apache的内置变量
    •2.0.50727是迅雷User-agent的特征字符串
    •RewriteRule后面的“点”表示“任意URI”,也就是不管请求的是什么,都输出abuse.txt

    文件访问控制

    RewriteEngine On
    RewriteCond %{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 On
    RewriteCond %{REQUEST_FILENAME} !([^/]+).css$
    RewriteCond %{REQUEST_FILENAME} !([^/]+).js$
    RewriteRule ^(.+)$ /chat/ [NC]




    RewriteEngine Off
    #RewiteBase /
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ blog/$1

    # 没有输入文件名的默认到到首页
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
    RewriteRule ^(/)?$ blog/index.php [L]

    防盗链:
    RewriteEngine on
    #RewiteBase /
    RewriteCond %{HTTP_REFERER} !^$ [NC]
    RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    RewriteCond %{HTTP_REFERER} !(www.)?baidu.com$ [NC]
    RewriteCond %{HTTP_REFERER} !(www.).google.com$ [NC]
    RewriteRule .(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]

    【RewriteCond语法】
    RewriteCond TestString CondPattern [flags]

    rewritecond的其他用法:
    "-d"(目录)
    将TestString视为一个路径名并测试它是否为一个存在的目录。
    "-f"(常规文件)
    将TestString视为一个路径名并测试它是否为一个存在的常规文件。
    "-s"(非空的常规文件)
    将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
    "-l"(符号连接)
    将TestString视为一个路径名并测试它是否为一个存在的符号连接。
    "-x"(可执行)
    将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
    "-F"(对子请求存在的文件)
    检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
    "-U"(对子请求存在的URL)
    检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

    【RewriteRule语法:】
    RewriteRule Pattern Substitution [flags]

    【flags】
    "chain|C"(链接下一规则)


    "cookie|CO=NAME:VAL:domain[:lifetime[:path]]"(设置cookie)


    "env|E=VAR:VAL"(设置环境变量)


    "forbidden|F"(强制禁止URL)


    "gone|G"(强制废弃URL)


    "handler|H=Content-handler"(强制指定内容处理器)


    "last|L"(结尾规则)


    "next|N"(从头再来)


    "nocase|NC"(忽略大小写)


    "noescape|NE"(在输出中不对URI进行转义)


    "nosubreq|NS"(不对内部子请求进行处理)


    "proxy|P"(强制为代理)


    "passthrough|PT"(移交给下一个处理器)


    "qsappend|QSA"(追加查询字符串)


    "redirect|R [=code]"(强制重定向)


    "skip|S=num"(跳过后继规则)


    "type|T=MIME-type"(强制MIME类型)

    RewriteRule ^(.+.php)s$ $1 [T=application/x-httpd-php-source]

    示例:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$
    RewriteCond %{REQUEST_URI} !^/blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /blog/$1
    
    # 没有输入文件名的默认到到首页
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$
    RewriteRule ^(/)?$ blog/index.php [L]

    RewriteEngine On】
    表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。

    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$】
    这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“/”,^表示 字符串开始,$表示字符串结尾,.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。

    【RewriteCond %{REQUEST_URI} !^/blog/】
    也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$

    【RewriteCond %{REQUEST_FILENAME} !-f】
    【RewriteCond %{REQUEST_FILENAME} !-d】
    这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径

    RewriteRule ^(.*)$ /blog/$1】
    重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。

    【RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$】
    【RewriteRule ^(/)?$ blog/index.php [L]】
    这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。

    现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1 前部分 ^(.*)$ 将会匹配当前请求的url。
    例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
    答 案是:(根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:RewiteBase /)有误,自己测试通不过,所以确的应该是 RewriteRule 中的跳转部分加上 http://协议

    还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。

    至此,完整的语句应该是:

    RewriteEngine On
    RewiteBase /
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ blog/$1
    
    # 没有输入文件名的默认到到首页
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
    RewriteRule ^(/)?$ blog/index.php [L]



    以上来自www.cnblogs.com/adforce/archive/2012/11/23/2784664.html

     help.vit.cn/item/category/htaccess 和 lesca.me/

  • 相关阅读:
    error和exception有什么区别?
    运行时异常与一般异常有何异同?
    由c++循环中局部变量地址不变而引发的思考
    Navicat连接Mysql数据库报错,但是命令行可以连接上
    git reset --hard HEAD^后显示more?的解决方案
    java基础易错、难理解、易混淆知识点复习
    More than one file was found with OS independent path 'assets/ap1.data'
    UML类图中方法(操作)的表示格式
    正则匹配以xx开头以xx结尾的单词
    运行PL/SQL时只输出anonymous block completed
  • 原文地址:https://www.cnblogs.com/lin3615/p/3543606.html
Copyright © 2011-2022 走看看