關于Apache mod_rewrite的中文配置、使用和語法介紹

來源: 我想網  發布時間: 2010-10-24 22:47  閱讀: 1997 次  推薦: 0   原文鏈接   [收藏]  
摘要:mod_rewrite截獲符合特定條件的URL,并按照設定的規則將它們改寫成需要的URL,這樣用戶和搜索引擎可以容易理解。

  介紹和配置:

  以數據庫后臺驅動的動態內容的網站,經常會遇到這些的問題:

這些問題都可以通過Apache服務器的一個基本的模塊mod_rewrite來解決,默認的安裝的Apache就會裝有這個模塊。要啟用這個模塊,打開 httpd.conf文件,察看下面的兩行是否被屏蔽,第一行是載入mod_rewrite模塊,第二行是啟用這個模塊。

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

mod_rewrite這個模塊是如何工作的呢?

mod_rewrite截獲符合特定條件的URL,并按照設定的規則將它們改寫成需要的URL。

比如,可以將 http://www.mysite.com/product.php?pid=123312 這樣的URL改寫成
http://www.mysite.com/product-123312.html 這樣的靜態URL,或者是更具體的 http://www.mysite.com/product/thinkpad-t42.html

重寫的規則

重寫的規則的表達式:

RewriteRule 模式替換 [選項]

RewriteRule 是一個簡單的命令告訴mod_rewrite這個模塊如何去重寫,關鍵的地方在于可以在模式和替換中使用正則表達式來匹配相應的字符,正則表達式的廣泛的靈活性能將動態的URL轉換成各式各樣的符合要求的靜態URL。看看這個重寫規則:

RewriteRule /products/([0-9]+)
/fancy/products.php?id=$1

當你在瀏覽器地址欄輸入 http://www.mysite.com/product/123 時,這個地址被重寫為 http://www.mysite.com/fancy/product.php?id=123

這樣,訪問者就無法知道你的程序真正放在那個目錄,程序的真正名字是什么,這也提高了網站的安全系數;這樣的URL也去掉了?=這些字符,易于搜索引擎的機器人爬行你的網站。

通過正則表達式,可以寫出更復雜的重寫規則:

RewriteRule ^/products$/content.php
RewriteRule ^/products/([0-9]+)$/content.php?id=$1
RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$)

重寫規則的選項有

  • 當在瀏覽器的地址欄輸入一個無效的參數時,會出現數據庫的錯誤提示,這是一個安全的隱患
  • 搜索引擎無法收錄你的所有網頁
  • 網頁的鏈接地址是一系列的參數,對瀏覽用戶和搜索引擎都不易理解
  • ‘forbidden’或‘f’– 403 禁止
  • ‘gone’或‘g’– 410 gone
  • ‘nocase’或‘NC’–大小寫敏感
  • ‘next’/N’–回到第一條規則
  • ’skip=N’或‘S=N’–跳過下面的N條規則

  流程控制

  mod_rewrite是按照從上到下的順序執行重寫的規則,如果URL匹配了第一條規則,則按照第一條規則進行重寫,如果不匹配,就執行第二條規則,直到最后。通過流程控制,可以定義在不同情況下采用不同的重寫規則。格式是:

RewriteCond 測試條件 Condition

  這些測試條件有:

  • HTTP變量: 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
  • 服務器內部變量: 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
  • mod_rewrite特殊值: API_VERSION, THE_REQUEST, REQUEST_URI,

  例如,利用mod_rewrite可以禁止從其他的網站鏈接到你的圖片:

RewriteCond %{HTTP_REFERER}!^$
RewriteCond %{HTTP_REFERER}!^http://localhost/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER}!^http://mysite.com/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER}!^http://www.mysite.com/.*$ [OR,NC]
RewriteRule .*\.(gif|GIF|jpg|JPG)$ http://mysite/images/bad.gif [L,R]

  配置apache mod_rewrite最簡單的方法

  在網上找了很多篇關于配置apache mod_rewrite的文章,發覺這篇最有用,大家需要的可參考一下。

  1,通過php提供的phpinfo()函數查看環境配置,通過Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已經開啟的模塊,如果里面包括“mod_rewrite”,則已經支持,不再需要繼續設置。
  如果沒有開啟“mod_rewrite”,則打開目錄您的apache安裝目錄“/apache/conf/”下的 httpd.conf 文件,通過Ctrl+F查找到“LoadModule rewrite_module”,將前面的”#”號刪除即可。如果沒有查找到,則到“LoadModule”區域,在最后一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必選獨占一行),然后重啟apache服務器即可。

  2,讓apache服務器支持”.htaccess”
  如何讓自己的本地APACHE服務器支持”.htaccess”呢?其實只要簡單修改一下apache的httpd.conf設置就可以讓APACHE支持.htaccess了。打開httpd.conf文件(在那里? APACHE目錄的CONF目錄里面),用文本編輯器打開后,查找

<Directory/>
Options FollowSymLinks
AllowOverride None
</Directory>

改為

<Directory/>
Options FollowSymLinks
AllowOverride All
</Directory>

  就可以了

 

  3,建立“.htaccess”文件
  如果是在windows平臺下,剛開始還真不知道怎么建立”.htaccess”文件,因為這個文件實際上沒有文件名,僅僅只有擴展名,通過普通方式是無法建立這個文件的,別著急,馬上告訴你三種方法:
  三種方法都是先建立一個htaccess.txt的文本文件(當然,這個文本文件的名字你可以隨便取),然后有三種方式給這個文件重命名:(1)用記事本打開,點擊文件–另存為,在文件名窗口輸入”.htaccess”,注意是整個綠色部分,也就是包含英文引號,然后點擊保存就行了。(2)進入cmd命令窗口,通過cd切換當剛建立htaccess.txt文件的文件夾,然后輸入命令:rename htaccess.txt .htaccess ,然后點擊鍵盤Enter鍵即可。(3)通過ftp連接htaccess.txt所在文件夾,通過ftp軟件重命名。
  那么我們須要建立幾個“.htaccess”文件,里面又輸入什么內容呢?基本的原則是這樣,根目錄必須有一個,用于重定向(URl重寫)所有的請求都會轉到到index.php(交給前端控制器);”./application”文件夾下須要一個,用于拒絕所有針對該文件夾內容的直接訪問(比如 http://localhost/application/models/User.php),這樣做是因為所有訪問請求必選通過前端控制器來分配訪問,其次為了安全;“./library”文件夾下的“.htaccess”同前;”./public”文件夾下必選建一個,因為這個文件夾的文件全部是供前端直接訪問的,因此須要撤銷URl重寫。以下是4個“./htaccess”文件的內容:
./.htaccess

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

./application/.htaccess

deny from all

./library/.htaccess

deny from all

./public

RewriteEngine off

  實際上,apache的url重寫功能也可以直接在httpd.conf文件中進行設置,這里就不具體講了,網上相關的教程也很多。

 

  Apache的RewriteRule規則詳細介紹:

  R[=code](force redirect)強制外部重定向
  強制在替代字符串加上http://thishost[:thisport]/前綴重定向到外部的URL.如果code不指定,將用缺省的302 HTTP狀態碼。
  F(force URL to be forbidden)禁用URL,返回403HTTP狀態碼。
  G(force URL to be gone)強制URL為GONE,返回410HTTP狀態碼。
  P(force proxy)強制使用代理轉發。
  L(last rule)表明當前規則是最后一條規則,停止分析以后規則的重寫。
  N(next round)重新從第一條規則開始運行重寫過程。
  C(chained with next rule)與下一條規則關聯
  如果規則匹配則正常處理,該標志無效,如果不匹配,那么下面所有關聯的規則都跳過。
  T=MIME-type(force MIME type)強制MIME類型
  NS (used only if no internal sub-request)只用于不是內部子請求
  NC(no case)不區分大小寫
  QSA(query string append)追加請求字符串
  NE(no URI escaping of output)不在輸出轉義特殊字符
  例如:RewriteRule /foo/(.*)/bar?arg=P1\%3d$1 [R,NE] 將能正確的將/foo/zoo轉換成/bar?arg=P1=zed
  PT(pass through to next handler)傳遞給下一個處理
  例如:
  RewriteRule ^/abc(.*)/def$1 [PT] #將會交給/def規則處理
    Alias /def /ghi
  S=num(skip next rule(s))跳過num條規則
  E=VAR:VAL(set environment variable)設置環境變量

  rewrite時服務器變量:
  HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT
  connection & request: REMOTE_ADDR, QUERY_STRING
  server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL
  system stuff: TIME_YEAR, TIME_MON, TIME_DAY

  Rewrite規則表達式的說明:

.匹配任何單字符
[chars] 匹配字符串:chars
[^chars] 不匹配字符串:chars
text1|text2 可選擇的字符串:text1或text2
? 匹配0到1個字符
*匹配0到多個字符
+匹配1到多個字符
^ 字符串開始標志
$字符串結束標志
\n 轉義符標志

反向引用$N 用于 RewriteRule 中匹配的變量調用(0 <= N <= 9)
  反向引用%N 用于 RewriteCond 中最后一個匹配的變量調用(1 <= N <= 9)

 

  RewriteCond標志符
  ‘nocase|NC’(no case)忽略大小
  ‘ornext|OR’(or next condition)邏輯或,可以同時匹配多個RewriteCond條件

  RewriteRule適用的標志符

‘redirect|R [=code]‘(force redirect)強迫重寫為基于http開頭的外部轉向(注意URL的變化)如:[R=301,L]
‘forbidden|F’(force URL to be forbidden)重寫為禁止訪問
‘proxy|P’(force proxy)重寫為通過代理訪問的http路徑
‘last|L’(last rule)最后的重寫規則標志,如果匹配,不再執行以后的規則
‘next|N’(next round)循環同一個規則,直到不能滿足匹配
‘chain|C’(chained with next rule)如果匹配該規則,則繼續下面的有Chain標志的規則。
‘type|T=MIME-type’(force MIME type)指定MIME類型
‘nosubreq|NS’(used only if no internal sub-request)如果是內部子請求則跳過
‘nocase|NC’(no case)忽略大小
‘qsappend|QSA’(query string append)附加查詢字符串
‘noescape|NE’(no URI escaping of output)禁止URL中的字符自動轉義成%[0-9]+的形式。
‘passthrough|PT’(pass through to next handler)將重寫結果運用于mod_alias
‘skip|S=num’(skip next rule(s))跳過下面幾個規則
‘env|E=VAR:VAL’(set environment variable)添加環境變量

 

  實際操作

  例子:

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.*– [F,L]

  這里”-”表示沒有替換,瀏覽器為IE和Opera的訪客將被禁止訪問。

  例子:

RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$/test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$/test/$1.php [L]
#for example: /test/admin.html => /test/admin.php

  限制目錄只能顯示圖片

< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME}!^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$– [F,L]
< /IfModule>

  Apache模塊 mod_rewrite 全面中文解釋文檔:http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_rewrite.html

0
0
 
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()