Linux中國

25 個有用 Apache 『.htaccess』 技巧

25 個 htaccess 小技巧

想要擁有一個網站,可以創建一個自己的本地伺服器,或者聯繫任何上面提到的或其它伺服器管理員來託管他的網站。但實際問題也從這點開始。網站的性能主要取決於以下因素:

  • 網站消耗的帶寬。
  • 面對黑客,網站有多安全。
  • 對資料庫進行數據檢索時的優化。
  • 顯示導航菜單和提供更多 UI 功能時的用戶友好性。

除此之外,保證託管網站伺服器成功的多種因素還包括:

  • 對於一個流行站點的數據壓縮量。
  • 同時為多個對請求同一或不同站點的用戶服務的能力。
  • 保證網站上輸入的機密數據安全,例如:Email、信用卡信息等等。
  • 允許更多的選項用於增強站點的動態性。

這篇文章討論一個伺服器提供的用於增強網站性能和提高針對壞機器人、熱鏈等的安全性的功能:『.htaccess』 文件。

.htaccess 是什麼?

htaccess (hypertext access,超文本訪問) 是為網站所有者提供用於控制伺服器環境變數以及其它參數的選項,從而增強他們網站的功能的文件。這些文件可以在網站目錄樹的任何一個目錄中,並向該目錄以及目錄中的文件和子目錄提供功能。

這些功能是什麼呢?其實這些是伺服器的指令,例如命令伺服器執行特定任務的行,這些命令只對該文件所在目錄中的文件和子目錄有效。這些文件默認是隱藏的,因為所有操作系統和網站伺服器默認配置為忽略它們,但如果查看隱藏文件的話,你就可以看到這些特殊文件。後續章節的話題將討論能控制什麼類型的參數。

注意:如果 .htaccess 文件保存在 /apache/home/www/Gunjit/ 目錄,那麼它會向該目錄中的所有文件和子目錄提供命令,但如果該目錄包含一個名為 /Gunjit/images/ 子目錄,且該子目錄中也有一個 .htaccess 文件,那麼這個子目錄中的命令會覆蓋父目錄中 .htaccess 文件(或者目錄層次結構中更上層的文件)提供的命令。

Apache Server 和 .htaccess 文件

Apache HTTP Server 俗稱為 Apache,是為了表示對一個有卓越戰爭策略技能的美洲土著部落的尊敬而命名。它基於 NCSA HTTPd 伺服器 ,是用 C/C++ 和 XML 建立的跨平台 Web 伺服器,它在萬維網的成長和發展中起到了關鍵作用。

它最常用於 UNIX,但 Apache 也能用於多種平台,包括 FreeBSD、Linux、Windows、Mac OS、Novel Netware 等。在 2009 年,Apache 成為第一個為超過一億站點提供服務的伺服器。

Apache 伺服器可以讓 www/ 目錄中的每個用戶有一個單獨的 .htaccess 文件。儘管這些文件是隱藏的,但如果需要的話可以使它們可見。在 www/ 目錄中可以有很多子目錄,每個子目錄通過用戶名或所有者名稱命名,包含了一個站點。除此之外你可以在每個子目錄中有一個 .htaccess 文件,像之前所述用於配置子目錄中的文件。

下面介紹如果配置 Apache 伺服器上的 htaccess 文件。

Apache 伺服器上的配置

這裡有兩種情況:

在自己的伺服器上託管網站

在這種情況下,如果沒有啟用 .htaccess 文件,你可以通過在 http.conf(Apache HTTP 守護進程的默認配置文件) 中找到 部分啟用。

<Directory "/var/www/htdocs">

定位如下行

AllowOverride None 

更改為

AllowOverride All

現在,重啟 Apache 後就啟用了 .htaccess。

在不同的託管服務提供商的伺服器上託管網站

在這種情況下最好諮詢託管管理員,如果他們允許訪問 .htaccess 文件的話。

用於網站的 25 個 Apache Web 伺服器 『.htaccess』 小技巧

1. 如何在 .htaccess 文件中啟用 mod_rewrite

mod_rewrite 選項允許你使用重定向並通過重定向到其它 URL 來隱藏你真實的 URL。這個選項非常有用,允許你用短的容易記憶的 URL 替換長 URL。

要允許 mod_rewrite,只需要在你的 .htaccess 文件的第一行添加如下一行。

Options +FollowSymLinks

該選項允許你跟蹤符號鏈接從而在站點中啟用 modrewrite。後面會介紹用短 URL 替換。(LCTT 譯註:+FollowSymLinks 只是啟用 modrewrite 的前提之一,還需要在全局和虛擬機中設置 RewriteEngine on 才能啟用重寫模塊。)

2. 如何允許或禁止對站點的訪問

通過使用 order、allow 和 deny 關鍵字,htaccess 文件可以允許或者禁止對站點或目錄中子目錄或文件的訪問。

只允許 IP 192.168.3.1 的訪問

Order Allow, Deny
Deny from All
Allow from 192.168.3.1

或

Order Allow, Deny
Allow from 192.168.3.1

這裡的 Order 關鍵字指定處理 allow 和 deny 訪問的順序。對於上面的 『Order』 語句,首先會處理 Allow 語句,然後是 deny 語句。

只禁止某個 IP 的訪問

下面一行的意思是除了 IP 地址 192.168.3.1,允許所有用戶訪問網站。

Order Allow, Deny
Deny from 192.168.3.1
Allow from All

或

Order Deny, Allow
Deny from 192.168.3.1

3. 為不同錯誤碼生成 Apache 錯誤文檔

用簡單幾行,我們可以解決當用戶/客戶端請求一個站點上不可用的網頁時伺服器產生的錯誤碼的錯誤文檔,例如我們大部分人見過的瀏覽器中顯示的 『404 Page not found』。『.htaccess』 文件指定了發生這些錯誤情況時採取何種操作。

要做到這點,需要添加下面的行到 『.htaccess』 文件:

ErrorDocument <error-code> <path-of-document/string-representing-html-file-content>

『ErrorDocument』 是一個關鍵字,error-code 可以是 401、403、404、500 或任何有效的表示錯誤的代碼,最後 『path-of-document』 表示本地機器上的路徑(如果你使用的是你自己的本地伺服器) 或伺服器上的路徑(如果你使用任何其它伺服器來託管網站)。

例子:

ErrorDocument 404 /error-docs/error-404.html

上面一行設置客戶請求任何無效頁面,伺服器報告 404 錯誤時顯示 error-docs 目錄下的 『error-404.html』 文檔。

<html><head><title>404 Page not found</title></head><body><p>The page you request is not present. Check the URL you have typed</p></body></html> 

上面的表示也正確,其中字元串相當於一個普通的 html 文件。

4. 設置/取消 Apache 伺服器環境變數

在 .htaccess 文件中你可以設置或者取消站點所有者可以更改的全局環境變數。要設置或取消環境變數,你需要在你的 .htaccess 文件中添加下面的行。

設置環境變數

SetEnv OWNER 「Gunjit Khera」

取消環境變數

UnsetEnv OWNER

5. 為文件定義不同 MIME 類型

MIME(多用途 Internet 多媒體擴展)是瀏覽器運行任何頁面所默認識別的類型。你可以在 .htaccess 文件中為你的站點定義 MIME 類型,然後伺服器就可以識別你定義類型的文件並運行。

<IfModule mod_mime.c>
    AddType application/javascript      js
    AddType application/x-font-ttf      ttf ttc
</IfModule>

這裡,mod_mime.c 是用於控制定義不同 MIME 類型的模塊,如果在你的系統中已經安裝了這個模塊,那麼你就可以用該模塊去為你站點中不同的擴展名定義不同的 MIME 類型,從而讓伺服器可以理解這些文件。

6. 如何在 Apache 中限制上傳和下載的大小

.htaccess 文件允許你能夠控制某個用戶從你的站點(通過 PHP)單次上傳數據量的大小(LCTT 譯註:原文有誤,修改)。要做到這點你只需要添加下面的行到你的 .htaccess 文件:

php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200

上面的行設置最大上傳大小、最大POST 提交數據大小、最長執行時間(例如,允許用戶在他的本地機器上單次執行一個請求的最大時間)、限制的最大輸入時間。

7. 讓用戶不能在你的站點上在線播放 .mp3 和其它文件

大部分情況下,人們在下載檢查音樂質量之前會在網站上播放等等。作為一個聰明的銷售者,你可以添加一個簡單的功能,不允許任何用戶在線播放音樂或視頻,而是必須下載完成後才能播放。這非常有用,因為(無緩衝的)在線播放音樂和視頻會消耗很多帶寬。

要添加下面的行到你的 .htaccess 文件:

AddType application/octet-stream .mp3 .zip 

8. 為站點設置目錄索引

大部分網站開發者都知道第一個顯示的頁面是哪個,例如一個站點的首頁,被命名為 『index.html』。我們大部分也見過這個。但是如何設置呢?

.htaccess 文件提供了一種方式用於列出一個客戶端請求訪問網站的主頁面時會順序掃描的一些網頁集合,相應地如果找到了列出的頁面中的任何一個就會作為站點的主頁面並顯示給用戶。

需要添加下面的行產生所需的效果。

DirectoryIndex index.html index.php yourpage.php

上面一行指定如果有任何訪問首頁的請求到來,首先會在目錄中順序搜索上面列出的網頁:如果發現了 index.html 則顯示為主頁面,否則會找下一個頁面,例如 index.php,如此直到你在列表中輸入的最後一個頁面。

9. 如何為文件啟用 GZip 壓縮以節省網站帶寬

繁忙的站點通常比只佔少量空間的輕量級站點運行更慢,這是常見的現象。因為對於繁忙的站點需要時間載入巨大的腳本文件和圖片以在客戶端的 Web 瀏覽器上顯示。

通常的機制是這樣的,當瀏覽器請求一個 web 頁面時,伺服器提供給瀏覽器該頁面,並在瀏覽器端顯示該 web 頁面,瀏覽器需要下載該頁面並運行頁面內的腳本。

這裡 GZip 壓縮所做的就是節省單個用戶的服務時間而不用增加帶寬。伺服器上站點的源文件以壓縮形式保存,當用戶請求到來的時候,這些文件以壓縮形式傳送,然後在客戶端上解壓(LCTT 譯註:原文此處有誤)。這改善了帶寬限制。

下面的行允許你壓縮站點的源文件,但要求在你的伺服器上安裝 mod_deflate.c 模塊。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/html
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

10. 處理文件類型

伺服器默認的有一些特定情況。例如:在伺服器上運行 .php 文件,顯示 .txt 文件。像這些我們可以以源代碼形式只顯示一些可執行 cgi 腳本或文件而不是執行它們(LCTT 譯註:這是為了避免攻擊者通過上傳惡意腳本,進而在伺服器上執行惡意腳本進行破壞和竊取)。

要做到這點在 .htaccess 文件中有如下行。

RemoveHandler cgi-script .php .pl .py
AddType text/plain .php .pl .py

這些行告訴伺服器只顯示而不執行 .pl (perl 腳本)、.php (PHP 文件) 和 .py (Python 文件) 。

11. 為 Apache 伺服器設置時區

從 .htaccess 文件可用於為伺服器設置時區可以看出它的能力和重要性。這可以通過設置一個伺服器為每個託管站點提供的一系列全局環境變數中的 『TZ』 完成。

由於這個原因,我們可以在網站上看到根據我們的時區顯示的時間。也許伺服器上其他擁有網站的人會根據他居住地點的位置設置時區。

下面的一行為伺服器設置時區。

SetEnv TZ India/Kolkata

12. 如果在站點上啟用緩存控制

瀏覽器很有趣的一個功能是,很多時間你可以看到,當多次同時打開一個網站和第一次打開相比前者會更快。但為什麼會這樣呢?事實上,瀏覽器在它的緩存中保存了一些通常訪問的頁面用於加快後面的訪問。

但保存多長時間呢?這取決於你自己。例如,你的 .htaccess 文件中設置的緩存控制時間。.htaccess 文件指定了站點的網頁可以在瀏覽器緩存中保存的時間,時間到期後需要重新驗證緩存,頁面可能會從緩存中刪除然後在下次用戶訪問站點的時候重建。

下面的行為你的站點實現緩存控制。

<FilesMatch ".(ico|png|jpeg|svg|ttf)$">
    Header Set Cache-Control "max-age=3600, public"
</FilesMatch>
<FilesMatch ".(js|css)$">
    Header Set Cache-Control "public"
    Header Set Expires "Sat, 24 Jan 2015 16:00:00 GMT"
</FilesMatch>

上面的行允許緩存 .htaccess 文件所在目錄中的頁面一小時。

13. 配置單個文件

通常 .htaccess 文件中的內容會對該文件所在目錄中的所有文件和子目錄起作用,但是你也可以對特殊文件設置一些特殊許可權,例如只禁止對某個文件的訪問等等。

要做到這點,你需要在文件中以類似方式添加 標記:

<files conf.html="">
Order allow, deny
Deny from 188.100.100.0
</files>

這是一個禁止 IP 188.100.100.0 訪問 『conf.html』 的簡單例子,但是你也可以添加介紹過的 .htaccess 文件的任何功能,包括將要介紹的功能,例如:緩存控制、GZip 壓縮。

大部分伺服器會用這個功能增強 .htaccess 文件的安全,這也是我們在瀏覽器上看不到 .htaccess 文件的原因。在後面的章節中會介紹如何給文件授權。

14. 啟用在 cgi-bin 目錄以外運行 CGI 腳本

通常伺服器運行的 CGI 腳本都保存在 cgi-bin 目錄中,但是你可以在你需要的目錄運行 CGI 腳本,只需要在所需的目錄中的 .htaccess 文件添加下面的行,如果沒有該文件就創建一個,並添加下面的行:

AddHandler cgi-script .cgi
Options +ExecCGI

15.如何用 .htaccess 在站點上啟用 SSI

伺服器端包括(SSI)顧名思義是和伺服器部分相關的東西。這是什麼呢?通常當我們在站點上有很多頁面的時候,我們在主頁上會有一個顯示到其它頁面鏈接的導航菜單,我們可以啟用 SSI 選項允許導航菜單中顯示的所有頁面完全包含在主頁面中。

SSI 允許多個頁面包含同樣的內容,因此只需要編輯一個文件就行,從而可以節省很多磁碟空間。對於 .shtml 文件,伺服器默認啟用了該選項。

如果你想要對 .html 啟用該選項,你需要添加下面的行:

AddHandler server-parsed .html

這樣 html 文件中如下部分會被替換為 SSI。

<!--#inlcude virtual="gk/document.html"-->

16. 如何防止網站列出目錄列表

為防止任何客戶端在本地機器羅列伺服器上的網站目錄列表,添加下面的行到你不想列出的目錄的文件中。

Options -Indexes

17. 更改默認字符集和語言頭

.htaccess 文件允許你更改網站使用的字符集,例如 ASCII 或 UNICODE,UTF-8 等,以及用於顯示內容的默認語言。

在伺服器的全局環境變數之後添加下面語句可以實現上述功能。

AddDefaultCharset UTF-8
DefaultLanguage en-US

18. 重定向一個非 www URL 到 www URL

在開始解釋之前,首先看看如何啟用該功能,添加下列行到 .htaccess 文件。

RewriteEngine ON
RewriteCond %{HTTP_HOST} ^abc.net$
RewriteRule (.*) http://www.abc.net/$1 [R=301,L]

上面的行啟用重寫引擎,然後在第二行檢查所有涉及到主機 abc.net 或 環境變數 HTTP_HOST 為 「abc.net」 的 URL。

對於所有這樣的 URL,代碼永久重定向它們(如果啟用了 R=301 規則)到新 URL http://www.abc.net/$1,其中 $1 是主機為 abc.net 的非 www URL。非 www URL 是大括弧內的內容,並通過 $1 引用。

重寫 URL 的重定向規則

重寫功能簡單的說,就是用短而易記的 URL 替換長而難以記憶的 URL。但是,在開始這個話題之前,這裡有一些本文後面會使用的特殊字元的規則和約定。

特殊符號:

符號              含義
^         -     字元串開頭
$         -     字元串結尾
|         -     或 [a|b] : a 或 b
[a-z]     -     a 到 z 的任意字母
+         -     之前字母的一次或多次出現
*         -     之前字母的零次或多次出現
?         -     之前字母的零次或一次出現

常量和它們的含義:

常量          含義
NC          -   區分大小寫
L           -   最後的規則 – 停止處理後面規則
R           -   臨時重定向到新 URL
R=301       -   永久重定向到新 URL
F           -   禁止發送 403 頭給用戶
P           -   代理 - 獲取遠程內容代替部分並返回
G           -   Gone, 不再存在
S=x         -   跳過後面的 x 條規則
T=mime-type -   強制指定 MIME 類型
E=var:value -   設置環境變數 var 的值為 value
H=handler   -   設置處理器
PT          -   Pass through - 用於 URL 還有額外的頭
QSA         -   將查詢字元串追加到替換 URL 

19. 重定向整個站點到 https

下面的行會幫助你轉換整個網站到 https:

RewriteEngine ON
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

上面的行啟用重寫引擎,然後檢查環境變數 HTTPS 的值。如果設置了那麼重寫所有網站頁面到 https。

20.一個自定義重寫例子

例如,重定向 url 『http://www.abc.net?p=100&q=20』 到 『http://www.abc.net/10020pq』。

RewriteEngine ON
RewriteRule ^http://www.abc.net/([0-9]+)([0-9]+)pq$ ^http://www.abc.net?p=$1&q=$2

在上面的行中,$1 表示第一個括弧,$2 表示第二個括弧。

21. 重命名 htaccess 文件

為了防止入侵者和其他人查看 .htaccess 文件,你可以重命名該文件,這樣就不能通過客戶端瀏覽器訪問。實現該目標的語句是:

AccessFileName  htac.cess

22. 如何為你的網站禁用圖片盜鏈

網站帶寬消耗比較大的另外一個重要問題是盜鏈問題,這是其它站點用於顯示你網站的圖片而鏈接到你的網站的鏈接,這會消耗你的帶寬。這問題也被成為 『帶寬盜竊』。

一個常見現象是當一個網站要顯示其它網站所包含的圖片時,由於該鏈接需要從你的網站載入內容,消耗你站點的帶寬而為其它站點顯示圖片。為了防止出現這種情況,比如對於 .gif、.jpeg 圖片等,下面的代碼行會有所幫助:

RewriteEngine ON
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERERER} !^http://(www.)?mydomain.com/.*$ [NC]
RewriteRule .(gif|jpeg|png)$ - [F].

上面的行檢查 HTTP_REFERER 是否沒有設為空或沒有設為你站點上的任何鏈接。如果是這樣的話,你網頁上的所有圖片會用 403 禁止訪問代替。

23. 如何將用戶重定向到維護頁面

如果你的網站需要進行維護並且你想向所有需要訪問該網站的你的所有客戶通知這個消息,對於這種情況,你可以添加下面的行到你的 .htaccess 文件,從而只允許管理員訪問並替換所有訪問 .jpg、.css、.gif、.js 等的頁面內容。

RewriteCond %{REQUEST_URI} !^/admin/ [NC]
RewriteCond %{REQUEST_URI} !^((.*).css|(.*).js|(.*).png|(.*).jpg)    [NC]
RewriteRule ^(.*)$ /ErrorDocs/Maintainence_Page.html [NC,L,U,QSA]

這些行檢查請求 URL 是否包含任何例如以 『/admin/』 開頭的管理頁面的請求,或任何到 『.png, .jpg, .js, .css』 頁面的請求,對於任何這樣的請求,用 『ErrorDocs/Maintainence_Page.html』 替換那個頁面。

24. 映射 IP 地址到域名

名稱伺服器是將特定 IP 地址轉換為域名的伺服器。這種映射也可以在 .htaccess 文件中用以下形式指定。

# 為了將IP地址 L.M.N.O 映射到域名 www.hellovisit.com
RewriteCond %{HTTP_HOST} ^L.M.N.O$ [NC]
RewriteRule ^(.*)$ http://www.hellovisit.com/$1 [L,R=301]

上面的行檢查任何頁面的主機是否包含類似 L.M.N.O 的 IP 地址,如果是的話第三行會通過永久重定向將頁面映射到域名 http://www.hellovisit.com

25. FilesMatch 標籤

類似用於應用條件到單個文件的 標籤, 能用於匹配一組文件並對該組文件應用一些條件,如下:

<FilesMatch 「.(png|jpg)$」>
Order Allow, Deny 
Deny from All
</FilesMatch>

結論

.htaccess 文件能實現的小技巧還有很多。這告訴了我們這個文件有多麼強大,通過該文件能給你的站點添加多少安全性、動態性以及其它功能。

我們已經在這篇文章中盡最大努力覆蓋儘可能多的 htaccess 小技巧,但如果我們缺少了任何重要的技巧,或者你願意告訴我們你的 htaccess 想法和技巧,你可以在下面的評論框中提交,我們也會在文章中進行介紹。

via: http://www.tecmint.com/apache-htaccess-tricks/

作者:Gunjit Khera 譯者:ictlyh 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國