有些用戶可能還不知道.htaccess文件是什麼,因此咱們首先來講明一下htaccess的做用。在wordpress的根目錄下,你會看到一 個名爲.htaccess的文件,它能夠是由系統建立、也能夠是用戶本身編輯而成的。它是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配 置,對wordpress中實現永久連接(Permalink)相當重要。同時利用它,咱們也能夠實現:網頁301重定向、自定義404錯誤頁面、改變文 件擴展名、容許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。下面咱們就來看看如何配製htaccess。php
如下是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模塊。css
「RewriteBase /」 用來表示Apache要對URL重寫的部分。比方站點爲http://domain.com/。RewriteBase後面爲「/」時,表示對主域名下面 的全部子路徑進行重寫,若是是「/blog/」 是隻會對http://domain.com/blog/後面的部分進行重寫。html
RewriteCond表示重寫URL應知足的一些條件,RewriteRule 後面的第一個參數表示要重寫的URL知足的規則(正則表達式),第二個參數表示重寫後的URL。最後的那個[L]表示代表當前規則是最後一條規則,中止分 析之後規則的重寫。(方框內還能夠支持不少其它參數,咱們會在下面介紹)前端
因此「RewriteRule ^index\.php$ – [L]」表示若當前請求的URL剛好爲index.php,則不要進行後面的判斷了。java
「RewriteCond %{REQUEST_FILENAME} !-f」和「RewriteCond %{REQUEST_FILENAME} !-d」表示當前的URL並非一個文件(-f)或目錄(-d)。當這兩個條件同時知足時,最後一條「RewriteRule . /index.php [L]」會把全部請求都重寫爲index.php。android
從這裏咱們能夠看出,wordpress默認把全部不指到靜態文件或目錄的url所有重寫到了index.php,而後由index.php統一處理請求。正則表達式
剛纔咱們提到了[L]的做用,其實RewriteRule還支持不少其它參數,包括:瀏覽器
上面講了一下Wordpress中.httaccess的基本用途,其實利用htaccess文件還能夠幫助咱們完成不少其它的工做。下面我來介紹其中一些經常使用的功能,更多的讀者能夠本身去嘗試。服務器
有些時候,咱們會想把domain.com的域名所有跳轉到www.domain.com下。這個時候htaccess就能夠派上用場了。在.htaccess文件中添加相似下面的代碼:(下面這段代碼在網站更換域名時,也一樣使用)
RewriteCond %{HTTP_HOST} ^domain\.com [NC] RewriteRule ^(.*)$ http://www.domain.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://domain.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://domain.com$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.domain.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.domain.com$ [NC] RewriteRule .*\.(gif|jpg|jpeg|png|bmp|swf|mp3|wav|zip|rar)$ http://www.domain.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。
若是你有一個固定的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下的話……您要是想要本身的整個網站都只能本身訪問的話,不妨試試。
若是有些垃圾網站的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://domain.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.domain.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時必定要當心,由於一但寫錯,極可能致使整個網站都沒法訪問。