在用Apache作web服務器的時候,有的時候須要將輸入的URL轉換成另外一個URL這種需求。好比用CodeIgniter框架開發web應用的時候,咱們訪問的全部路徑都要通過index.php,由這個index.php作統一路由,訪問地址以下:php
example.com/index.php/news/article/my_article
每次訪問都帶着index.php,實在太多餘了,咱們想要一個乾淨的地址以下:html
example.com/news/article/my_article
這時你的 Apache 服務器須要啓用mod_rewrite,而後簡單的經過一個 .htaccess 文件再加上一些簡單的規則就能夠移除URL中的 index.php 了。下面是這個文件的一個例子, 其中使用了 "否認條件" 來排除某些不須要重定向的項目:web
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
在上面的例子中,除已存在的目錄和文件,其餘的 HTTP 請求都會通過你的 index.php 文件。也就是說單用戶在地址欄裏輸入【example.com/news/article/my_article】的時候實際上訪問的是【example.com/index.php/news/article/my_article】。正則表達式
Apache2.xapache
LoadModule rewrite_module modules/mod_rewrite.so
編程
啓用.htaccess
AllowOverride None 修改成: AllowOverride All服務器
學習Rewrite須要重點了解它的三個核心:RewriteEngine,RewriteCond,RewriteRule。app
這個是rewrite功能的總開關,用來開啓是否啓動url rewrite框架
RewriteEngine on
編程語言
RewriteCond就是一個過濾條件,簡單來講,當URL知足RewriteCond配置的條件的狀況,就會執行RewriteCond下面緊鄰的RewriteRule語句。
RewriteCond的格式以下:RewriteCond %{NAME_OF_VARIABLE} REGX FLAG
舉個例子:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.* RewriteRule index.php index.m.php
若是設置上面的匹配規則,到來的http請求頭中的HTTP_USER_AGENT匹配【^Mozilla//5/.0.*】正則表達式的話,則執行下面的RewriteRule,也就是說訪問路徑會跳轉到 index.m.php這個文件。
RewriteCond 和 RewriteRule 是上下對應的關係。能夠有1個或者好幾個RewriteCond來匹配一個RewriteRule
那麼RewriteCond能夠匹配什麼樣的數據請求呢?
RewriteCond %{HTTP_REFERER} (www.test.cn) RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.* RewriteCond %{REQUEST_FILENAME} !-f
上面是常見的3種最多見使用最多的HTTP頭鏈接與請求匹配。
RewriteRule是配合RewriteCond一塊兒使用,能夠說,RewriteRule是RewriteCond成功匹配後的執行結果,因此,它是很重要的。
RewriteRule的格式
RewriteRule Pattern Substitution [flags]
Pattern是一個正則匹配。Substitution是匹配的替換 [flags]是一些參數限制;
舉幾個栗子:
RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L]
意思是以 room開頭的 room/video/123.html 這樣子,變成 web/index.php?c=room&a=video&r=123
RewriteRule \.(jpg|gif) http://image.baidu.com/ [R,NC,L]
意思是覺得是訪問.jpg或者gif的文件,都會調整到 http://image.baidu.com
從上面看出,掌握Rewrite,學習正則表達式是關鍵所在。
咱們再看看[flags]是什麼意思?
由於它太多了。我就挑幾個最經常使用的來講說。