htaccess文件配置說明-(持續更新中)

簡介: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

相關文章
相關標籤/搜索