程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> .htaccess rewrite 規則詳細說明

.htaccess rewrite 規則詳細說明

編輯:PHP基礎知識
 

用Apache虛擬主機的朋友很多,apache提供的.htaccess模塊可以為每個虛擬主機設定rewrite規則,這對網站SEO優化相當有用,同時也改善了用戶體驗。國內的虛擬機一般不提供.htaccess功能(據我所知,discuz的主機好像提供此功能),而在國外主機中,.htaccess功能似乎是標配,筆者的Blog架在MT上,支持.htaccess,每次看到一堆別人寫好了的.htaccess設置,很多命令都不甚了了,查看、修改起來很不方便,痛定思痛,潛心學習一下,知其所以然嘛~

 

學習前提:(不會的朋友要學習一下,才能更好的理解下面的文字呢)
◾Linux基礎(不會也沒事啦,寫個.htaccess沒必要大費周折啦,推薦:鳥哥私房菜linux基礎)
◾正則表達式(Rewrite規則建立在正則的基礎之上,推薦:正則表達式30分鐘入門教程

rewrite的語法格式:
1.RewriteEngine On #要想rewrite起作用,必須要寫上哦
2.RewriteBase url-path #設定基准目錄,例如希望對根目錄下的文件rewrtie,就是”/”
3.RewriteCond test-string condPattern #寫在RewriteRule之前,可以有一或N條,用於測試rewrite的匹配條件,具體怎麼寫,後面會詳細說到。
4.RewriteRule Pattern Substitution #規則

 

RewriteEngine On|Off

RewriteEngine 用於開啟或停用rewrite功能。
rewrite configurations 不會自動繼承,因此你得給每個你想用 rewrite功能的虛擬主機目錄中加上這個指令。

RewriteBase URL-path

RewriteBase用於設定重寫的基准URL。在下文中,你可以看見RewriteRule可以用於目錄級的配置文件中 (.htaccess)並在局部范圍內起作用,即規則實際處理的只是剝離了本地路徑前綴的一部分。處理結束後,這個路徑會被自動地附著回去。默認值 是”RewriteBase physical-directory-path”。
在對一個新的URL進行替換時,此模塊必須把這個URL重新注入到服務器處理中。為此,它必須知道其對應的URL前綴或者說URL基准。通常,此前綴就是 對應的文件路徑。但是,大多數網站URL不是直接對應於其物理文件路徑的,因而一般不能做這樣的假定! 所以在這種情況下,就必須用RewriteBase指令來指定正確的URL前綴。
如果你的網站服務器URL不是與物理文件路徑直接對應的,而又需要使用RewriteBase指令,則必須在每個對應的.htaccess文件中指定 RewriteRule 。

RewriteCond TestString CondPattern [flags]

RewriteCond指令定義了一個規則的條件,即,在一個RewriteRule指令之前有一個或多個RewriteCond指令。 條件之後的重寫規則僅在當前URI與pattern匹配並且符合這些條件的時候才會起作用。
TestString是一個純文本的字符串,但是還可以包含下列可擴展的成分:
1.RewriteRule反向引用: 引用方法是 $N (0 <= N <= 9) 引用當前(帶有若干RewriteCond指令的)RewriteRule中的 與pattern匹配的分組成分(圓括號!)。
2.RewriteCond反向引用: 引用方法是 %N (1 <= N <= 9) 引用當前若干RewriteCond條件中最後符合的條件中的分組成分(圓括號!)。
3.RewriteMap 擴展: 引用方法是 ${mapname:key|default}
4.服務器變量: 引用方法是 %{ NAME_OF_VARIABLE } 這個是我們最常使用到的功能

NAME_OF_VARIABLE具體數值見下表:


HTTP headers:

connection & request:


HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals:

system stuff:

specials:

DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ


這些都對應於類似命名的HTTP MIME頭、Apache服務器的C變量以及Unix系統中的 struct tm字段,大多數都在其他的手冊或者CGI規范中有所講述。 而其中為mod_rewrite所特有的變量有:
IS_SUBREQ
如果正在處理的請求是一個子請求,它包含字符串”true”,否則就是”false”。 模塊為了解析URI中的附加文件,有可能會產生子請求。
API_VERSION
這是正在使用的httpd中(服務器和模塊之間內部接口)的Apache模塊API的版本, 其定義位於include/ap_mmn.h中。此模塊版本對應於正在使用的Apache的版本 (比如,在Apache 1.3.14的發行版中,這個值是19990320:10)。 通常,對它感興趣的是模塊的作者。
THE_REQUEST
這是由浏覽器發送給服務器的完整的HTTP請求行。(比如, “GET /index.html HTTP/1.1″). 它不包含任何浏覽器發送的附加頭信息。
REQUEST_URI
這是在HTTP請求行中所請求的資源。(比如上述例子中的”/index.html”.)
REQUEST_FILENAME
這是與請求相匹配的完整的本地文件系統的文件路徑名或描述.

CondPattern是條件pattern, 即, 一個應用於當前實例TestString的正則表達式, 即, TestString將會被計算然後與CondPattern匹配.

注意:CondPattern是一個兼容perl的正則表達式, 但是還有若干補充:
1.可以在pattern串中使用’!‘ 字符(驚歎號)來實現匹配的反轉。

RewriteOptions Options

RewriteOptions指令為當前服務器級和目錄級的配置設置一些選項。 Option可以是下列值之一:
inherit此值強制當前配置可以繼承其父配置。 在虛擬主機級配置中,它意味著主服務器的映射表、條件和規則可以被繼承。 在目錄級配置中,它意味著其父目錄的.htaccess中的條件和規則可以被繼承。MaxRedirects=number為了避免目錄級RewriteRule的無休止的內部重定向, 在此類重定向和500內部服務器錯誤次數達到一個最大值的時候, mod_rewrite會停止對此請求的處理。 如果你確實需要對每個請求允許大於10次的內部重定向,可以增大這個值。
RewriteRule Pattern Substitution [flags]

RewriteRule指令是重寫引擎的根本。此指令可以多次使用。 每個指令定義一個簡單的重寫規則。這些規則的定義順序尤為重要, 因為,在運行時刻,規則是按這個順序逐一生效的.

Pattern是一個作用於當前URL的兼容perl的正則表達式。

此外,還可以使用否字符(‘!‘)的pattern前綴,以實現pattern的反轉。但是,需要注意的是使用否字符以反轉pattern時,pattern中不能使用分組的通配成分;即$N。

重寫規則中的Substitution是, 當原始URL與Pattern相匹配時,用以替代(或替換)的字符串。除了純文本,還可以使用


◾$N 反向引用RewriteRule的pattern
◾%N 反向引用最後匹配的RewriteCond pattern
◾規則條件測試字符串中(%{VARNAME})的服務器變量
◾映射函數調用(${mapname:key|default})

 


下面給出幾個完整的例子供各位參考:


一、防盜鏈功能
只這四行就實現了防盜鏈是不是很神奇^_^,編寫起來是不是又覺得復雜。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]


二、網址規范化
這個是把所有二級域名都重定向到www.yourdomain.com的例子,現在看來是不是很簡單了?
Options +FollowSymLinks
rewriteEngine on
rewriteCond %{http_host} ^yourdomain.com [NC]
rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]


三、臨時錯誤頁面
當你的網站在升級、修改的時候,你最好讓訪客轉到指定的頁面,而不是沒做完的頁面或者是錯誤頁。
RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /error.html [R=302,L]


四、重定向RSS地址到FeedSky
除了可以更改模板裡的RSS地址外,.htaccess也能實現RSS地址的更改,並更加方便。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]
RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved