有些使用者可能還不知道.htaccess 檔案是什麼,所以我們首先來說明一下 htaccess 的作用。在 WordPress 的
根目錄下,你會看到一個名為.htaccess 的檔案,它可以是由系統建立、也可以是使用者自己編輯而成的。它是 Apache 伺服器中的一個配置檔案,它負
責相關目錄下的網頁配置,對 WordPress 中實現永久連結 (Permalink) 至關重要。同時利用它,我們也可以實現:網頁 301 重定向、自定義

404 錯誤頁面、改變副檔名、允許/阻止特定的使用者或者目錄的訪問、禁止目錄列表、配置預設檔案等功能。下面我們就來看看如何配製 htaccess 。

以下是 WordPress 中預設的 htaccess 內容。我們一一來看一下每一行的作用。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

第一行用來判斷 Apache 中是否安裝了 rewrite 模組。如果存在 rewrite 模組,「RewriteEngine On」 則用來開啟 rewrite 模組。

「RewriteBase /」
用來表示 Apache 要對 URL 重寫的部分。比方站點為 http://domain.com/。 RewriteBase 後面為 「/」 時,表示對主域名下面
的所有子路徑進行重寫,如果是 「/blog/」 是隻會對 http://domain.com/blog/後面的部分進行重寫。

RewriteCond 表示重寫 URL 應滿足的一些條件,RewriteRule
後面的第一個引數列示要重寫的 URL 滿足的規則 (正規表示式),第二個引數列示重寫後的 URL 。最後的那個 [L] 表示表明當前規則是最後一條規則,停止分
析以後規則的重寫。 (方框內還可以支援很多其它引數,我們會在下面介紹)

所以 「RewriteRule ^index.php$ – [L]」 表示若當前請求的 URL 恰好為 index.php,則不要進行後面的判斷了。

「RewriteCond %{REQUEST_FILENAME} !-f」 和 「RewriteCond
%{REQUEST_FILENAME}
!-d」 表示當前的 URL 並不是一個檔案 (-f) 或目錄 (-d) 。當這兩個條件同時滿足時,最後一條 「RewriteRule . /index.php
[L]」 會把所有請求都重寫為 index.php 。

從這裡我們可以看出,WordPress 預設把所有不指到靜態檔案或目錄的 url 全部重寫到了 index.php,然後由 index.php 統一處理請求。

剛才我們提到了 [L] 的作用,其實 RewriteRule 還支援很多其它引數,包括:

  • R 強制外部重定向,後面可以代 301 或 302 跳轉。
  • F 停用 URL, 返回 403HTTP 狀態碼。
  • G 強制 URL 為 GONE,返回 410HTTP 狀態碼。
  • P 強制使用代理轉發。
  • L 表明當前規則是最後一條規則,停止分析以後規則的重寫。
  • N 重新從第一條規則開始執行重寫過程。
  • C 與下一條規則關聯。
  • T=MIME-type(force MIME type) 強制 MIME 型別。
  • NS 只用於不是內部子請求。
  • NC 不區分大小寫。
  • QSA 追加請求字串。
  • NE 不在輸出轉義特殊字元。

htaccess 在 WordPress 中的一些使用技巧

上面講了一下 WordPress 中.httaccess 的基本用途,其實利用 htaccess 檔案還可以幫助我們完成很多其它的工作。下面我來介紹其中一些常用的功能,更多的讀者可以自己去嘗試。

域名跳轉

有些時候,我們會想把 weixiaoduo.com 的域名全部跳轉到 www.weixiaoduo.com 下。這個時候 htaccess 就可以派上用場了。在.htaccess 檔案中新增類似下面的程式碼:(下面這段程式碼在網站更換域名時,也同樣使用)

RewriteCond %{HTTP_HOST} ^weixiaoduo.com [NC]
RewriteRule ^(.*)$ https://www.weixiaoduo.com/$1 [L,R=301]

類似的還可以用 htacess 也可以用來更換 URL 的目錄結構,這個在 Category 名字被更換時特別有用:

RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]

注:R 後面的 301 表示此跳轉為永久跳轉,也可以根據實際情況該成臨時跳轉 (302) 。

防盜鏈

圖片的盜鏈可能是很多站長最為頭痛的事情,自己的圖片被人白白拿去不說,還會免費佔用了自己網站的資源,使用 htaccess 檔案同樣可以實現防盜鏈的功能。程式碼如下:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://weixiaoduo.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://weixiaoduo.com$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.weixiaoduo.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.weixiaoduo.com$ [NC]
RewriteRule .*.(gif|jpg|jpeg|png|bmp|swf|mp3|wav|zip|rar)$ https://www.weixiaoduo.com/404.html [R,NC]

這段程式碼會判斷請求的 referer,如果連結不是從本站點選過來的,預設都會跳轉到一個 404 頁面。在 RewriteRule 中指定了要防盜鏈的檔案型別。

防止垃圾評論

例用 htaccess 同樣可以防止一部分來源不明的垃圾評論:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post.php*
RewriteCond %{HTTP_REFERER} !.*domain.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://domain.com/$ [R=301,L]

這段程式碼,判斷一個 POST 請求是否是由瀏覽器發出的 (判斷 HTTP_USER_AGENT 是否為空),並且 Refer 是否本站的,只要其中任意一個條件不滿足,就將請求自動跳轉到首頁。

注意,這段程式碼只適用於 WordPress,其實的框架可以根據其具體情況把 wp-comments-post 修改成對應的 URL 。

只允許自己訪問 WordPress 的後臺

如果你有一個固定的 IP,那麼你完全可以在 htaccess 中設定只有自己能訪問 WordPress 的後臺。在 wp-admin 目錄下建立一個新的.htaccess 檔案,裡面寫入如下程式碼:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all

# xx.xx.xx.xx 為您的 IP,您也以設定多個 IP 。
allow from xx.xx.xx.xx
allow from xx.xx.xx.xxx
</LIMIT>

注:對於這段程式碼,一定是在 wp-admin 資料夾下建立新的 htaccess,很多坑爹的文章都沒有告訴你這一點,直接新增到網站根目錄下的那個 htacess 下的話……您要是想要自己的整個網站都只能自己訪問的話,不妨試試。

阻止某些 IP 訪問自己的網站

如果有些垃圾網站的 Robot 總是不停的抓取你網站的資料,你可以在 htaccess 中遮蔽掉這些 IP 。

<Limit GET POST>
order allow,deny
deny from xx.xx.xx.xx
allow from all
</Limit>

類似的,更換一下 deny 和 allow,可以實現只允許某些特定 IP 訪問自己的網站,當然如果您真的想要這麼做的話。

判斷瀏覽器

瀏覽器相容可以說是前端工程師最為心痛的事。與其在 css 中寫各種 hack,不如在 htacess 中判斷瀏覽器,直接指向不同的 css 檔案。

RewriteCond %{REQUEST_URI} index.css*
RewriteCond %{HTTP_USER_AGENT} "^Mozilla/4.0$"
RewriteRule ^(.*)$ http://weixiaoduo.com/firefox.css

類似的,利用 htacess 判斷訪問者是否持有的是移動裝置也很容易。

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} "Windows CE" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "NetFront" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Palm OS" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Blazer" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Elaine" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "^WAP.*$" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Plucker" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "vodafone" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "iPhone" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "nokia" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "symbian" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Opera Mini" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "BlackBerry" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "j2me" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "midp" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "htc" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "java" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "sony" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "android" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "AvantGo" [NC]
RewriteRule (.*) http://mobi.weixiaoduo.com/ [R,L]

因為有點多,為了方便閱讀,還有通用的瀏覽器的 USER_AGENT 放在了文章的最後。有興趣的讀者去可以去看看吧。

禁止訪問特定的檔案型別或檔案

有些特定的檔案、或某些檔案,我們可能不想讓使用者訪問到,可以用如下程式碼:

<Files secretfile.jpg>
 order allow,deny 
 deny from all 
</Files>

<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
 Order Allow,Deny 
 Deny from all 
</FilesMatch>

判斷瀏覽器的語言

想要根據瀏覽器的語言設定,跳轉到不同的頁面,可以用如下程式碼:

RewriteCond %{HTTP:Accept-Language} ^zh-cn.*$ [NC]
RewriteRule ^/?$  index_cn.htm [R=301,L]

總結

就說到這裡了,其實 htaccess 的用途還有很多很多,讀者可以根據上面的例子自己去挖掘 htaccess 的新的用途。不過注意修改 htaccess 時一定要小心,因為一但寫錯,很可能導致整個網站都無法訪問。