簡介:php
htaccess是apache的配置文件,能夠實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、容許/阻止特定的用戶或者目錄的訪問、禁止目錄列表等功能。git
啓用.htaccess,須要修改httpd.conf,啓用AllowOverride。同時.htaccess與httpd.conf配置文件不一樣的是,它只做用於當前目錄。另外httpd.conf只是在Apache服務啓動的時正則表達式
候就加載的,而.htaccess只要有用戶訪問目錄時加載,開銷大、速度慢。thinkphp
既然如此,爲何咱們還要用.htaccess呢?由於它配置起來簡單,它還支持重定向、URL重寫以及訪問驗證,另外它管理起來很方便,能夠很好適應網站遷移。總之,各有優缺點,主要就看你是要從全局考慮仍是隻配置單個目錄。下面來看看一些經常使用的配置的一些說明:apache
「RewriteEngine On」,開啓 Rewrite 規則開關;瀏覽器
「RewriteCond」指重寫的條件安全
RewriteCond %{REQUEST_FILENAME} !-f 若是不是文件繼續執行下面的RewriteRule(理解爲:若是文件存在,就直接訪問文件,不進行下面的RewriteRule)服務器
RewriteCond %{REQUEST_FILENAME} !-d 若是不是目錄繼續執行下面的RewriteRule(理解爲:若是目錄存在就直接訪問目錄不進行RewriteRule)dom
「RewriteRule」,定義一條重寫規則,後面的字符串經過正則表達式進行匹配,匹配字符串以 ^ 開頭並以 $ 結尾,替換字符串中 $1 指被第一次被匹配成功的字符串ide
%{HTTP_REFERER} 指獲取當前訪問請求的來源網址
經常使用配置:
1)、阻止經過讀取和寫入 .htaceess 來更改服務器安全性的設置
<files .htaccess> order allow,deny deny from all </files>
2)、限制文件上傳大小(這個可以幫助阻止 DoS 攻擊(用戶經過上傳巨大的文件來沖垮服務器)而且可以節約帶寬。)
# limit file uploads to 10mb LimitRequestBody 10240000
3)、自定義錯誤頁面
ErrorDocument 404 /notfound.php ErrorDocument 403 /forbidden.php ErrorDocument 500 /error.php
4)、禁止訪問目錄
# disable directory browsing
Options All -Indexes
5)、圖片防盜鏈(當有人試着直接連接到你的網站上圖片,下面的代碼將會使其顯示 stealingisbad.gif
這張圖片。)
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] (NC表示不區分大小寫) RewriteRule \.(gif|jpg|png)$ http://www.yourdomain.com/stealingisbad.gif [R,L] (R表示跳轉,L表示最後一條重寫規則)
#註釋:若是請求地址不爲空,或者不是www.yourdomain.com、yourdomain.com的 後綴爲git|jpg|png的,轉到stealingisbad.gi
6)、頂級域名重定向到二級域名上(優化和提升網站搜索排名)
RewriteEngine On RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
附加:
rewrite重寫時,帶參數:
RewriteRule 不會去匹配?後面的參數,須要用RewiteCond 來匹配
例如:把 /abc?id=123 重定向到 /def.php?id=123 的寫法:
方式一:
RewriteEngine on RewriteBase / RewriteCond %{QUERY_STRING} ^id=(.+)$ RewriteRule ^/abc$ /def.php?sid=%1 [L]
#註釋1:RewriteCond %{QUERY_STRING} ^id=(.+)$ ,獲得url中的變量,並經過「%N」的方式獲取(參數名能夠重寫,並且參數值能夠匹配)
#註釋2:RewriteCond 裏面須要提取的值能夠用 %N 進行反向引用值,而RewriteRule裏面仍是須要用$N的來反向引用值
若是 http://127.0.0.1/rewrite/jeecn.zdz?par=helloforbworld 中的 query_string包含字符串forb ,則禁止訪問
RewriteCond %{QUERY_STRING} forb
RewriteRule ^(.*)\.(.*)$ preg.php?%{QUERY_STRING} [F]
eg.2
經過[QSA]標誌保留原有URL參數的同時,在後面增長新的URL參數:param=value
RewriteRule ^/page /page?param=value [QSA]
eg3.
當URL參數包含字符串parm時
將URL:http://jeecn.com/ask?param=value 重寫爲: http://jeecn.com/answer?param=value
RewriteCond %{QUERY_STRING} parm
RewriteRule ^/ask /answer
eg4.%n反向引用
1)當訪問 /path 時,將字符串 parm修改成 showparm
RewriteCond %{QUERY_STRING} ^(.*)parm(.*)$ RewriteRule /path /path?%1showparm%2
上面的%1和%2是反向引用,來自以前的RewriteCond中正則表達式的匹配結果
2)將http://jeecn.com/path?key=value 轉換爲: http://jeecn.com/path/key/value
RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$ RewriteRule ^/path /path/%1/%2?
方式二:
RewriteEngine on RewriteBase / RewriteRule ^/abc$ /def.php [L,QSA]
#註釋1:[QSA]表示保留重寫url時「?」後面的參數(但參數名不能夠重寫,只會原樣的保留)
正則(這裏只列出部分的,其餘的正則遵循正則表達式):
RewriteCond語法參數:
# 位於行首時表示註釋。
-d 測試字符串是不是已存在的目錄
-f 測試字符串是不是已存在的文件
-s 測試字符串所指文件是否有"非零"值(非空的常規文件)
-l視爲一個路徑名並測試它是否爲一個存在的符號鏈接(符號鏈接)
-x(可執行)視爲一個路徑名並測試它是否爲一個存在的、具備可執行權限的文件。該權限由操做系統檢測
RewriteRule語法參數:
[F] Forbidden(禁止) : 命令服務器返回 403 Forbidden錯誤給用戶瀏覽器
[L] Last rule(最後一條規則) : 告訴服務器在本條規則執行完後中止重寫URL
[N] Next(下一條規則) : 告訴服務器繼續重寫,指導全部重寫指令都執行過
[G] Gone(丟失) : 命令服務器返回410 GONE(no longer exists)錯誤消息
[P] Proxy(代理) : 告訴服務器經過mod_proxy模塊處理用戶請求
[C] Chain(捆綁) : 告訴服務器將當前的規則和前面的規則進行捆綁
[R] Redirect(重定向) : 命令服務器發出重定向消息,以便用戶瀏覽器發出rewritten/modified(重寫/修改)URL的請求
[NC] No Case(不區分大小寫) : 對客戶端請求的URL不區分大小寫
[PT] Pass Through(放行) : 讓mod_rewrite模塊將重寫的URL傳回給Apache作進一步處理
[OR] Or(邏輯或) : 用邏輯"或"將兩個表達式鏈接在一塊兒,若是結果爲"真",則會應用後繼的相關規則
[NE] No Escape(禁用轉義) : 命令服務器在輸出時禁用轉義字符
[NS] No Subrequest(禁用子請求) : 若是存在內部子請求,則跳過當前命令
[QSA] Append Query String(追加查詢字符串) : 命令服務器在URL末尾追加查詢字符串
[S=x] Skip(跳過) : 若是知足某指定的條件,則跳事後面第x調規則
[E=variable:value] Environmental Variable(環境變量) : 命令服務器將值value賦給變量variable
[T=MIME-type] Mime Type(MIME類型) : 聲明目標資源所屬的MIME類型
例如thinkphp隱藏index.php:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
上面部分摘抄自sjy之家:http://www.sjyhome.com/htaccess