1、.htaccess文件使用前提
.htaccess的主要作用就是實現url改寫,也就是當瀏覽器通過url訪問到服務器某個文件夾時,作為主人,我們可以來接待這個url,具體 地怎樣接待它,就是此文件的作用。所有的訪問都是通過URL實現,所以.htaccess的作用非同小可。正因為此,所以一般地網站通過設 置.htaccess,通過一個十分友好的url吸引用戶進來,然后用.htaccess把用戶帶到需要訪問的位置。
要想使用這個強大功能,就得開啟apache里面的重寫模塊。
前面的文章中曾經講到過windows和ubuntu開啟 rewrite模塊使用.htaccess 。
其實開啟模塊大體的步驟都是一樣的,無論是Windows和linux。
2、.htaccess基本語法介紹
開啟重寫引擎 :RewriteEngine on
設置重寫的根目錄:RewriteBase / — 說明 :因為定義了這個文件夾,所以對應的替換就有了一個參照。
匹配所有符合條件的請求:RewriteCond — 說明:RewriteCond 定義了一系列規則條件,這個指令可以有一條或者多條,只有用戶拿來的url符合這些條件之后,我們的.htaccess才開始接待,否則用戶就直接自己去 訪問所需要的目錄了。
舉個例子,為了能讓搜索引擎更多地抓取我們的網頁而避免重復抓,我們通常把沒有www的域名重定向到www.XXX.com,如下就實現了這個功能:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^nbphp\.com$ [NC]
RewriteRule ^(.*)$ http://www.nbphp.com/$1 [R=301,L]
上例便把nbphp.com 重定向到www.nbphp.com
%{HTTP_HOST} 是指取得用戶訪問的URL的主域名 然后空格后面是一個正則表達式匹配,意識就是說是否是 nbphp.com 。
如果用戶訪問使用的URL滿足所有列出的RewriteCond 提出的條件,那么進行下一步RewriteRule 即開始進行引導,這才開始實現.htaccess文件的重要功能。
同樣,前面是正則表達式,用戶分析用戶的除了主域名nbphp.com之外的URL ,^(.*)$的意思就是所有的內容。 然后空格后面寫的是我們引導用戶訪問的目錄,我們帶着他走到新的一個域名上。$1 指的是前面括號里匹配url所得到的內容。
這樣就是一個完整的小例子。關於RewriteCond里 如何調用url的某個部分,我們可以參考這篇文章(Apache的Mod_rewrite學習 (RewriteCond重寫規則的條件);
3、現學現用,學習正則表達式。
推薦一個經典的教程: 正則表達式30分鍾入門教程
這個教程的確很簡單,看完基本上寫一些簡單的正則就沒有問題了。正則是一個需要長期使用的工具,隔段時間不用會忘記,所以我每次都看一遍這個教程。其實學過之后重要的就是一點內容。我簡單羅列了如下:
. 換行符以外的所有字符
\w匹配字母或數字或下划線或漢字
\s匹配任意的空白符
\d匹配數字
\b匹配單詞的開始或結束
^匹配字符串的開始
$匹配字符串的結束
*重復零次或更多次
*重復零次或更多次
+重復一次或更多次
?重復零次或一次
{n}重復n次
{n,}重復n次或更多次
{n,m}重復n到m次
應用替換時,前面第一個()中匹配的內容后面就用$1引用,第二個()中匹配的就用$2應用……
推薦一個實用的正則在線測試網站 http://www.regextester.com/
我們來分析一下 discuz7.0 搜索引擎優化 htaccess 里面的重寫。
首先加入用戶通過 nbphp.com/forum-2-3.html 訪問discuz論壇,那么先通過.htaccess過濾,看看是否需要.htaccess引導一下用戶,如果滿足列出的一系列RewriteCond的 條件那么就進行重寫,discuz的沒有列出RewriteCond 所以應該全部都進行重寫。所以開始進行轉寫,forum-2-3.html 這個正好符合 列出的^forum-([0-9]+)-([0-9]+)\.html$ 正則表達式。並且 $1 為 2 ,$2為3 ,所以代入后面,即 forumdisplay.php?fid=2&page=3 加上前面的RewriteBase 指定的文件目錄,那么就帶他到制定目錄的forumdisplay.php?fid=2&page=3 。
4、常見的.htaccess應用舉例(部分例子引自四個例子實戰講解.htaccess文件rewrite規則)
4.1防止盜鏈,如果來得要訪問jpe jpg bmp png結尾的url 用戶不是來自我們的網站,那么讓他看一張我們網站的展示圖片。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
4.2 網站升級的時候,只有特定IP才能訪問,其他的用戶將看到一個升級頁面
RewriteEngine on
RewriteCond %{REQUEST_URI} !/upgrade.html$
RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30
RewriteRule $ http://www.nbphp.com/upgrade.html [R=302,L]
4.3把老的域名轉向新域名
# redirect from old domain to new domain
RewriteEngine On
RewriteRule ^(.*)$http://www.yourdomain.com/$1[R=301,L]
5、一些其他功能
5.1 引出錯誤文檔的目錄
ErrorDocument 400 /errors/badrequest.html
ErrorDocument 404 http://yoursite/errors/notfound.html
ErrorDocument 401 “Authorization Required
5.2 Blocking users by IP 根據IP阻止用戶訪問
order allow,deny
deny from 123.45.6.7
deny from 12.34.5. (整個C類地址)
allow from all
5.3 防止目錄瀏覽
# disable directory browsing
Options All -Indexes
5.4設置默認首頁
# serve alternate default index page
DirectoryIndex about.html
5.5 把一些老的鏈接轉到新的鏈接上——搜索引擎優化SEO
Redirect 301 /d/file.htmlhttp://www.htaccesselite.com/r/file.html
5.6為服務器管理員設置電子郵件。
ServerSignature EMail
SetEnv SERVER_ADMINdefault@domain.com
總結:
本文章主要介紹了應用最廣最實用的重寫功能,記住.htaccess的權限要設置成644