25 個有用 Apache ‘.htaccess’ 技巧
網站是我們生活中重要的一部分。它們是實現擴大業務、分享知識以及其它更多功能的方式。早期受制于只能提供靜態內容,隨著動態客戶端和服務器端腳本語言的引入和現有靜態語言的持續改進,例如從 html 到 html5,動態網站成為可能,剩下的也許在不久的將來也會實現。
對于網站,隨之而來的是需要一個能向全球大規模用戶顯示站點的某個東西。這個需求可以通過托管網站的服務器實現。這包括一系列的服務器,例如:Apache HTTP Server、Joomla 以及 允許個人擁有自己網站的 WordPress。
25 個 htaccess 小技巧
想要擁有一個網站,可以創建一個自己的本地服務器,或者聯系任何上面提到的或其它服務器管理員來托管他的網站。但實際問題也從這點開始。網站的性能主要取決于以下因素:
- 網站消耗的帶寬。
- 面對黑客,網站有多安全。
- 對數據庫進行數據檢索時的優化。
- 顯示導航菜單和提供更多 UI 功能時的用戶友好性。 </ul>
- 對于一個流行站點的數據壓縮量。
- 同時為多個對請求同一或不同站點的用戶服務的能力。
- 保證網站上輸入的機密數據安全,例如:Email、信用卡信息等等。
- 允許更多的選項用于增強站點的動態性。 </ul>
除此之外,保證托管網站服務器成功的多種因素還包括:
這篇文章討論一個服務器提供的用于增強網站性能和提高針對壞機器人、熱鏈等的安全性的功能:‘.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</pre>
這里的 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</pre>
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 OWNER5. 為文件定義不同 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 .zip8. 為站點設置目錄索引
大部分網站開發者都知道第一個顯示的頁面是哪個,例如一個站點的首頁,被命名為 ‘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/Kolkata12. 如果在站點上啟用緩存控制
瀏覽器很有趣的一個功能是,很多時間你可以看到,當多次同時打開一個網站和第一次打開相比前者會更快。但為什么會這樣呢?事實上,瀏覽器在它的緩存中保存了一些通常訪問的頁面用于加快后面的訪問。
但保存多長時間呢?這取決于你自己。例如,你的 .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> 標記:
<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 +ExecCGI15.如何用 .htaccess 在站點上啟用 SSI
服務器端包括(SSI)顧名思義是和服務器部分相關的東西。這是什么呢?通常當我們在站點上有很多頁面的時候,我們在主頁上會有一個顯示到其它頁面鏈接的導航菜單,我們可以啟用 SSI 選項允許導航菜單中顯示的所有頁面完全包含在主頁面中。
SSI 允許多個頁面包含同樣的內容,因此只需要編輯一個文件就行,從而可以節省很多磁盤空間。對于 .shtml 文件,服務器默認啟用了該選項。
如果你想要對 .html 啟用該選項,你需要添加下面的行:
AddHandler server-parsed .html這樣 html 文件中如下部分會被替換為 SSI。
<!--#inlcude virtual="gk/document.html"-->16. 如何防止網站列出目錄列表
為防止任何客戶端在本地機器羅列服務器上的網站目錄列表,添加下面的行到你不想列出的目錄的文件中。
Options -Indexes17. 更改默認字符集和語言頭
.htaccess 文件允許你更改網站使用的字符集,例如 ASCII 或 UNICODE,UTF-8 等,以及用于顯示內容的默認語言。
在服務器的全局環境變量之后添加下面語句可以實現上述功能。
AddDefaultCharset UTF-8 DefaultLanguage en-US18. 重定向一個非 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 的任意字母
- 之前字母的一次或多次出現
- 之前字母的零次或多次出現
? - 之前字母的零次或一次出現</pre>
常量和它們的含義:
常量 含義 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
來源: https://linux.cn/article-5731-1.html
- 之前字母的零次或多次出現
? - 之前字母的零次或一次出現</pre>