1. 程式人生 > >apache的.htaccess文件作用和相關配置

apache的.htaccess文件作用和相關配置

接下來 覆蓋 move erer 密碼保護 nbsp 力度 徹底 即使

首先.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文件作用和相關配置