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


簡介:

htaccess是apache的配置文件,可以實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表等功能。

啟用.htaccess,需要修改httpd.conf,啟用AllowOverride。同時.htaccess與httpd.conf配置文件不同的是,它只作用於當前目錄。另外httpd.conf只是在Apache服務啟動的時

候就加載的,而.htaccess只要有用戶訪問目錄時加載,開銷大、速度慢。

  既然如此,為什么我們還要用.htaccess呢?因為它配置起來簡單,它還支持重定向、URL重寫以及訪問驗證,另外它管理起來很方便,可以很好適應網站遷移。總之,各有優缺點,主要就看你是要從全局考慮還是只配置單個目錄。下面來看看一些常用的配置的一些說明:

“RewriteEngine On”,開啟 Rewrite 規則開關;

“RewriteCond”指重寫的條件

RewriteCond %{REQUEST_FILENAME} !-f  如果不是文件繼續執行下面的RewriteRule(理解為:如果文件存在,就直接訪問文件,不進行下面的RewriteRule)

RewriteCond %{REQUEST_FILENAME} !-d 如果不是目錄繼續執行下面的RewriteRule(理解為:如果目錄存在就直接訪問目錄不進行RewriteRule)

“RewriteRule”,定義一條重寫規則,后面的字符串通過正則表達式進行匹配,匹配字符串以 ^ 開頭並以 $ 結尾,替換字符串中 $1 指被第一次被匹配成功的字符串

%{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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM