使用Apache的模塊:rewrite模塊語法格式

Preface

不管是對於搜索引擎仍是對於訪客而言,不少網站程序生成的URL並不友好,因此須要將URL以更簡短的方式來重寫。這種技術能夠解決不少常見的問題,如:頁面僞靜態域名重定向等。URL重寫並不是只有Apache的rewrite模塊能作到,ISAPI也能夠實現。但ISAPI只能用於Wndows,國內不少虛擬空間都只支持ISAPI2,功能較弱。rewrite模塊的強大在於,他能夠用正則來實時重寫URL請求,一個規則能夠擁有不少子規則、附加條件。javascript

下圖是有一條重寫條件的重寫規則,能夠看出Rewrite最基本的格式:重寫條件(RewriteCond)是字符串在前,正則在後;重寫規則(RewriteRule)是正則在前,字符串在後。本文將從幾個簡單例子出發,說明一些經常使用的Rewrite的語法,並解決具體的問題。

php

EXAMPLE 1

RewriteEngine on
RewriteCond $1 !(index\.php|images)
RewriteRule ^(.*)$ /index.php?page=$1 [L]

  • RewriteEngine on:開啓Rewritecss

  • RewriteCond $1 !(index\.php|images):若是文件不爲index.php或目錄不爲images。html

  • RewriteRule ^(.*)$ /index.php?page=$1:轉給index.php處理。java

  • $1表明引用RewriteRule中的第一個正則(.*)表明的字符。RewriteCond中的正則很普通,因此不作說明。RewriteRule中的正則,(.*)表明任意字符,^是開始錨,$是結束錨。linux

    設置以後,當訪問dmyz.org/about時,實際是訪問dmyz.org/index.php?page=about,從url中省略掉了index.php。這一規則常常用於框架開發環境,由於大多數框架都是將全部的請求提交給一個入口文件(一般是index.php)來處理的。瀏覽器

    將第三行修改:bash

    RewriteRule ^(.*)\.htm$ /index.php?page=$1

  • 訪問dmyz.org/about.htm時實際訪問的仍然是dmyz.org/index.php?page=about,這就實現簡單的僞靜態了。服務器

    EXAMPLE 2

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*) /404.htm

  • 用這個簡單的例子來講明重寫條件(RewriteCond)使用的服務器變量特殊正則app

    %{REQUEST_FILENAME}得到一個服務器變量的值,!-f是正則,其中感嘆號表否認,-f用來檢測當前值所表明的路徑是不是一個常規文件。所以例2實現的是:當訪問的文件不是一個常規文件時,轉到404.htm頁面。這就是一個簡單的用Rewrite實現404頁面重定向的例子。還能夠補充一下,將其修改成:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f#若是當前變量所表明的路徑不是一個常規目錄
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) /404.htm

  • 服務器變量有不少,經常使用的以下表:

    服務器變量 用途 參考
    %{HTTP_USER_AGENT} 訪客的瀏覽器類型 Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8GTB7.1
    %{HTTP_REFERER} 訪問的連接地址 http://dmyz.org/archives/99
    %{HTTP_FORWARDED} 經過HTTP得到地址,一般是訪客的IP地址,但HTTP頭能夠修改,因此若是要判斷訪客的IP,推薦使用%{REMOTE_ADDR} 192.168.0.1
    %{HTTP_HOST} 訪問的域名 http://dmyz.org
    %{SERVER_ADDR} 服務器的IP地址 127.0.0.1
    %{REMOTE_ADDR} 訪客IP地址 192.168.0.1
    %{REMOTE_USER} 只在HTTP驗證中有用,保存驗證時使用的用戶名 admin
    %{REQUEST_METHOD} 提交查詢的方式 GET或是POST
    %{SCRIPT_FILENAME} 所訪問的文件的絕對路徑 /var/www/dmyz.org/htdocs/index.php
    %{QUERY_STRING} 查詢字符串,包含查詢變量名和參數 page=1&name=dmyz
    %{TIME_YEAR}/%{TIME_MON}/%{TIME_DAY} 獲取年/月/日 2010/09/30

    EXAMPLE 3

    RewriteEngine on
    RewriteCond %{QUERY_STRING} ^pageid\=(.*)?$ [NC]
    RewriteRule ^index(.*)$ http://dmyz.org/thread.php\?fid=%1 [R=301,L]

  • 本例中使用了配置指令,和重寫規則對重寫條件的引用。

    如例2所說,重寫條件可使用服務器變量和特殊正則,但重寫規則不能夠。因此須要在重寫規則中反向引用重寫條件的內容。例3中使用%1來反向引用(.*)?。當查詢字符串爲pageid=任意字符串時,跳轉到thread.php?fid=任意字符串。這條正則很適合網站搬家、更換程序後,將原地址轉向到新地址。

    前兩個例子,重寫條件和重寫規則都只有兩個參數——正則和字符串,本例中追加第三個參數,它被稱爲標識,跟在重寫條件和重寫規則以後的,做爲輔助、補充之用。本例中使用了最簡單三個標識:

    1. [NC]:忽略大小寫。

    2. [L]:結尾標識。中止重寫操做,並再也不應用其餘重寫規則。防止本條規則被後續規則影響。

    3. [R=301]:利用HTTP 301跳轉。

    還有其餘頗有用的標識,能夠參考Apache手冊


    附:最近遇到的幾個問題,雖然使用了.htaccess文件,但並未使用rewrite,一併寫在這裏。設置了Expires headers,關閉了Etag,開啓了Wordpress的Gzip壓縮。設置以後本站Yslow等級爲A。

    # BEGIN WordPressRewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    # END WordPress 
    # BEGIN GzipSetOutputFilter DEFLATE
    AddOutputFilterByType DEFLATE text/html text/css image/gif image/jpeg image/png application/x-javascript# END Gzip # BEGIN EtagFileETag none# END Etag # BEGIN Expires headersHeader set Expires "Thu, 15 Oct 2010 20:00:00 GMT"# END Expires headers

  • Related Posts

相關文章
相關標籤/搜索