美文网首页Web前端我爱编程
apache的.htaccess文件作用和相关浅析

apache的.htaccess文件作用和相关浅析

作者: michaelgbw | 来源:发表于2016-08-30 19:47 被阅读660次

    文/michaelgbw

    首先.htaccess什么?

    .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。

    当我们使用apache部署一个网站代码准备部署到网上的时候,我们手中的apache的httpd.conf大家肯定都知道。这是apache的配置文件,然而我们大多数的网站都是基于云服务器来部署的,还有就是团队协作开发的时候,我们很难直接修改公共的httpd.conf,这时 .htaccess就是httpd.conf的衍生品,它起着和httpd.conf相同的作用。

    .htaccess的基本作用
    • URL重写、自定义错误页面
    • MIME类型配置
    • 访问权限控制等
    • 主要体现在伪静态的应用
    • 图片防盗链
    • 自定义404错误页面
    • 阻止/允许特定IP/IP段
    • 目录浏览与主页
    • 禁止访问指定文件类型
    • 文件密码保护
    如何启用呢

    首先我们找到httpd.conf,查找AllowOverride。启用AllowOverride

    这个作用是允许重写覆盖相关配置

    将AllowOverride None改为 All

    再打开mod_rewrite机制,即还是在.httpd.conf中查找mod_rewrite.so

    这个作用是在httpd.conf外重写配置

    先给个福利

    这里分享给大家一个自动生成.htaccess的网站,懒人必备哦

    我们接下来接着分析相关功能

    自定义错误页面
    写法:ErrorDocument 错误代码 空格 /目录名/文件名.扩展名

    例子:

    • ErrorDocument 404 /404.html
    • ErrorDocument 500 /500.htm

    这样写好后保存后,重启apache(一旦修改就一定要重启apache,后文不再赘述),我们发现对应的错误代码显示的页面即是我们指定的文件,很好理解

    URL重写

    这个功能是.htaccess很强大的功能,试想我们做好的web一般都不想让用户多输入url吧,还有就是什么.php.asp.do统统去掉才好.
    首先把这个功能打开

    # 将 RewriteEngine模式打开
     RewriteEngine On 
    

    我们先截取一段thinkphp中的默认隐去.php的.htaccess

      RewriteEngine On
    
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    

    第一眼看上去,这都什么鬼,之前还同学问我这段代码就是这样吗?
    额,是的,absulotly~我们慢慢分析下
    首先这里面有两个基本的命令: RewriteCond和 RewriteRule
    RewriteCond Syntax: RewriteCond TestString CondPattern [flags]

    • TestString是一个纯文本的字符串,除了包含普通的字符外 ,还可以包含
      1.RewriteMap扩展:引用方法是:${mapname:key|default}
      2.TestString可以包含服务器变量 ,引用方法是:%{val}
      其中val(变量)可以是

    这里我们列举出一些常用的val:
    REQUEST_FILENAME
    这是与请求相匹配的完整的本地文件系统的文件路径名。
    HTTPS
    如果连接使用了SSL/TLS,它将包含字符串”on”,否则就是”off”(无论mod_ssl 是否已经加载,该变量都可以安全的使用)。
    REQUEST_URI
    这是在HTTP请求行中所请求的资源.
    其实有些val和PHP中的许多变量是相同的,比如:

    RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
    RewriteRule  index.php index1php
    RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
    RewriteRule  index.php index2.php 
    RewriteRule  index.php index3.php
    

    也就相当于PHP

    <?php
        if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
        {
            header("Location:1.php");
        }
        else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
        {
            header("Location:2.php");
        }
        else
            header("Location:3.php");
    ?>
    

    CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式,这个正则表达式是和perl通用的。

    但还有不同于不同正则的
    1、可以在CondPattern串的开头使用”!’(惊叹号)来指定 不匹配 。
    2、CondPatterns有若干特殊的变种。 除了正则表达式的标准用法,还有下列用法:
    将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString小于CondPattern则为真。
    “>CondPattern”————-(词典顺序的大于)
    将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString大于CondPattern则为真。
    “=CondPattern”————-(词典顺序的等于)
    将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。
    如果CondPattern是”"—(两个双引号),则TestString将与空字符串进行比较。
    “-d”————-(目录)
    将TestString视为一个路径名并测试它是否为一个存在的目录。
    “-f “————-(常规文件)
    将TestString视为一个路径名并测试它是否为一个存在的常规文件。
    “-s “————-(非空的常规文件)
    将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
    “-l “————-(符号连接)
    将TestString视为一个路径名并测试它是否为一个存在的符号连接。
    “-x “————-(可执行)
    将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。 该权限由操作系统检测。
    “-F “————-(对子请求存在的文件)
    检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。
    “-U “————-(对子请求存在的URL)

    [flags]

    作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表。

    RewriteRule

    RewriteRule Syntax: Pattern rewritePattern [flags]

    • Pattern就是正则,如php。
    • rewritePattern 是针对Pattern 匹配后的URL进行rewritePattern 规定的替换。应用替换时,前面Pattern 第一个()中匹配的内容后面rewritePattern 就可以用$1引用,第二个()中匹配的就用$2应用……以此类推。
    • flags和上面的RewriteCond一致,这里不再赘述啦~

    而我们的例子中的三行就是

    • RewriteCond %{REQUEST_FILENAME} !-f
      #如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
    • RewriteCond %{REQUEST_FILENAME} !-d
      #如果目录存在就直接访问目录不进行RewriteRule
      RewriteRule ^(.)$ index.php/$1 [QSA,PT,L]
      #对于所有的( ^(.
      ) )加上 “index.php/” 拼接为index.php/XXX( ^(.*) ),
      追加请求串(QSA)移交给下一个处理器 pass through(PT(可不是代理为MIME类型,PT是一个flage)),而且这是 last最后的rules(L)的 。

    好长的一串,这回有点懂了吧。我们继续吧~

    阻止/允许特定的IP地址
    • deny from 127.0.0.1 #阻止这个ip
    • allow from 192.168.0.1#允许这个ip
    • deny 202.200.*.* #阻止所有202.200开头的ip
      这个也比较好理解。
    通过.htaccess放盗链
    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain(/)?.*$     [NC]
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?baidu(/)?.*$     [NC]
    RewriteRule .*\.(gif|jpg|jpeg|bmp|png)$ http://mydomain/404.html [R,NC,L]
    

    这个呢,和之前的一样,把除了mydomain和baidu域名的请求图片都冲定位到404.html.这就起到了防盗链的需求。

    重定向
    • Redirect permanent index.php home.php #永久重定向
    • Redirect temp index.php home.php #临时重定向

    关于临时和永久的重定向就是302和301
    我们摘抄出来一段话
    (1)301 redirect——301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。

    (SEO(搜索引擎优化)中提到一点:如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的PageRank等信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。)

    (2)302 redirect——302代表暂时性转移(Temporarily Moved ),在前些年,不少Black Hat SEO曾广泛应用这项技术作弊,目前,各大主要搜索引擎均加强了打击力度,象Google前些年对Business.com以及近来对BMW德国网站的惩罚。即使网站客观上不是spam,也很容易被搜寻引擎容易误判为spam而遭到惩罚。

    (3)meta fresh——这在2000年前比较流行,不过现在已很少见。其具体是通过网页中的meta指令,在特定时间后重定向到新的网页,如果延迟的时间太短(约5秒之內),会被判断为spam。

    结束语

    最近马上进入校招阶段,我想说我们应聘者不应该为了面试而面试,这样不求原理的“默写”,或许可以通过面试,但在今后的工作中就会吃力不少,出来混都是要还的,希望这篇文章对大家的有少许帮助!~~

    相关文章

      网友评论

        本文标题:apache的.htaccess文件作用和相关浅析

        本文链接:https://www.haomeiwen.com/subject/znzfettx.html