• 使用.htaccess实现apache URL重定向


    一、什么是URL重定向?

      URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术。

    二、URL重定向怎么配置?

      1)首先需要apache开启重定向,修改httpd.conf配置:

    1    查找:
    2    Options FollowSymLinks 
    3   AllowOverride None
    5   改为: 
    6   Options FollowSymLinks 
    7   AllowOverride All

          2)去掉下面的注释 

    LoadModule rewrite_module modules/mod_rewrite.so      //去掉行前的#

          3)重定向的配置在哪写?

            有两种方式,第一种是在httpd.conf中写,这种写法适合有服务器完整权限的网站管理员,写法大概如下:

    <VirtualHost *:80>
        ServerAdmin yangjx009@139.com
        DocumentRoot "/websites/www"
        ServerName localhost
        RewriteEngine On
        RewriteRule ^index.html$ index.php [L]
    </VirtualHost>
    httpd.conf配置url重定向

      4)我们这里主要介绍另外一种方式:在网站目录中使用.htaccess,这种方法适合采用虚拟主机形式的网站管理员,

             这两种办法设置的重定向规则其实基本上都是一样的,只是设置的地方不同。

    三、基本正则表达式

      因为URL重定向语法中大量使用了正则表达式,并且正则是每隔一段时间不用都必然会淡忘的东西,所以我们有必要先回顾一下基本的正则写法:

    .    换行符以外的所有字符
     
    w   匹配字母或数字或下划线或汉字
     
    s   匹配任意的空白符
     
    d   匹配数字
     
       匹配单词的开始或结束
     
     ^   匹配字符串的开始
     
     $   匹配字符串的结束
     
     *   重复零次或更多次
     
     +   重复一次或更多次
     
     ?   重复零次或一次
     
     {n}         重复n次
     
     {n,}        重复n次或更多次
     
     {n,m}       重复n到m次
     
     () $1 $2    一个括号代表一个分组,第一个括号里匹配的内容就用$1引用,第二个括号匹配的内容用$2引用,以此类推......

    四、.htaccess都可以做什么?

      .htaccess文件可以的事情,主要包括:文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,等等。。

    五、.htaccess语法规则

      我们先看一个图片防盗链的例子:

    1 RewriteEngine On
    2 RewiteBase /
    3 RewriteCond %{HTTP_REFERER} !^http://(.+.)?baidu.com/ [NC]        //如果来源网址不是*.baidu.com

    3 RewriteCond %{HTTP_REFERER} !^$ //并且来源网址不是空

    4 RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L] //如果访问的文件后缀是jpeg,jpg,gif,bmp,png的图片,则重定向到一个固定的图片

      然后我们下面根据这个例子依次展开说明:

        第一行:

    RewriteEngine On|Off           //RewriteEngine 用于开启或停用rewrite功能。

       第二行:

    RewriteBase URL-path
    /*
    设定基准目录,例如希望对根目录下的文件rewrtie,就是”/”
    RewriteBase用于设定重写的基准URL。
    在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。
    通常,此前缀就是 对应的文件路径。但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定! 所以在这种情况下,
    就必须用RewriteBase指令来指定正确的URL前缀。 如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteBase指令,则必须在每个对应的.htaccess文件中指定 RewriteRule 。
    */

       第三行:

    RewriteCond TestString CondPattern [flags]
    /*
    1、RewriteCond:
    指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。 2、TestString:
    是一个纯文本的字符串,但是还可以包含下列可扩展的成分: 3、RewriteRule反向引用:
    引用方法是 $N (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。 4、RewriteCond反向引用:
    引用方法是 %N (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。 5、RewriteMap 扩展:
     引用方法是 ${mapname:key|default} 6、服务器变量:
    引用方法是 %{ NAME_OF_VARIABLE } 这个是我们最常使用到的功能
    7、CondPattern:
    是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.
    可以在pattern串中使用!
    字符(惊叹号)来实现匹配的反转。
    8、flags 参见下表
    */
    服务器变量NAME_OF_VARIABLE具体数值见下表:
    HTTP_USER_AGENT                  //主要用于检测访问者系统和浏览器等
    HTTP_REFERER                     //从哪个页面链接过来 
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST                        //域名
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT                      
    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE
    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
    API_VERSION                      //这是正在使用的httpd中(服务器和模块之间内部接口)的Apache模块API的版本, 其定义位于include/ap_mmn.h中。此模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。
    THE_REQUEST                      //这是由浏览器发送给服务器的完整的HTTP请求行。(比如, “GET /index.html HTTP/1.1″). 它不包含任何浏览器发送的附加头信息。
    REQUEST_URI                      //这是在HTTP请求行中所请求的资源。
    REQUEST_FILENAME                 //这是与请求相匹配的完整的本地文件系统的文件路径名或描述.
    IS_SUBREQ                        //如果正在处理的请求是一个子请求,它包含字符串”true”,否则就是”false”。 模块为了解析URI中的附加文件,有可能会产生子请求。

       flags

    RewriteRule flag
    RewriteRule标记 含 义 描 述
    R Redirect 发出一个HTTP重定向
    F Forbidden 禁止对URL地址的存取
    G Gone 标记URL地址不存在
    P Proxy 将URL地址传递给mod_proxy
    L Last 停止处理接下来的规则
    N Next 再次重第一个规则开始处理,但是使用当前重写后的URL地址
    C Chain 将当前的规则和紧随其后的规则链接起来
    T Type 强制执行指明的MIME类
    NS Nosubreq 只在没有任何内部子请求执行时运行本脚本
    NC Nocase URL地址匹配对大小写不敏感
    QSA Qsappend 在新的URL地址后附加查询字符串部分,而不是替代
    PT Passthrough 将重写后的URL地址传递给另一个Apache模块进行进一步处理
    S Skip 忽略之后的规则
    E Env 设置环境变量
    rewritecond的其他用法:
    “-d”(目录)
        将TestString视为一个路径名并测试它是否为一个存在的目录。
    “-f”(常规文件)
        将TestString视为一个路径名并测试它是否为一个存在的常规文件。
    “-s”(非空的常规文件)
        将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
    “-l”(符号连接)
        将TestString视为一个路径名并测试它是否为一个存在的符号连接。
    “-x”(可执行)
        将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
    “-F”(对子请求存在的文件)
        检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
    “-U”(对子请求存在的URL)
        检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

        第四行:

    RewriteRule Pattern Substitution [Flags]
    /*
    其中的Pattern就是参数,一般为一些文件的扩展名;
    Substitution是用来替换前面用的;
    这儿的Flags,参考上面的表格,常用的R表示 redirect(强制重定向),F表示forbidden(禁止访问),L表示last(最后),通常当你希望停止重写操作而立即重定向时,可用它。
    */

    五、更多使用举例:

    1、图片重定向

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^localhost$    //如果域名是localhost
    RewriteCond %{REQUEST_FILENAME} !-f     //并且访问的文件找不到
    RewriteRule ^images/(.+) http://127.0.0.1/test/showimages/$1 [R=302,L]     //则跳转到另一个域名下的另一个目录访问这个图片

    2、二级域名重定向到www.yourdomain.com

    rewriteEngine on
    rewriteCond %{http_host} ^yourdomain.com [NC]
    rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

    3、网站升级时,临时错误页面

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !/maintenance.html$     //如果请求的地址不是maintenance.html
    RewriteCond %{REMOTE_ADDR} !^123.123.123.123       //客户端ip如果不是这个
    RewriteRule $ /error.html [R=302,L]                //则重定向到error.html这个升级提醒页面

    4、重定向RSS地址到FeedSky

    RewriteEngine on
    RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]
    RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours

    5、防止目录浏览:

    Options All -Indexes

    6、404重定向

    ErrorDocument 404 /404.html

    7、设置目录默认页面

    DirectoryIndex about.html

    备注:.htaccess的权限要设置成644

    扩展阅读:

    http://blog.neazor.com/?p=559

    http://www.cnblogs.com/ganiks/p/htaccess-get-started.html

  • 相关阅读:
    thinkphp配置加载
    thinkphp数据输出
    thinkphp 命名规范
    array_fill — 用给定的值填充数组
    array_fill_keys — 使用指定的键和值填充数组
    array_change_key_case — 将数组中的所有键名修改为全大写或小写
    HTMLCSS样式表
    MySql查询语句中的变量使用
    使用java8的方法引用替换硬编码
    如何搭建一个自己的网站(绝对详细~)
  • 原文地址:https://www.cnblogs.com/itshark/p/5849750.html
Copyright © 2020-2023  润新知