1. 程式人生 > >apache 路由、rewrite重寫

apache 路由、rewrite重寫

一、開啟重寫模組

apache 的配置檔案 httpd.conf   開啟   LoadModule rewrite_module modules/mod_rewrite.so

二、配置重寫規則

1. apache 主配置檔案 httpd.conf (伺服器級別,需要擁有伺服器的管理許可權)

2. 使用在httpd.conf裡定義的虛擬主機配置中

3. 目錄下 .htaccess 檔案中(目錄級http://www.haolizi.net/別,作用於當前目錄專案)

如果是使用  .htaccess 需要在主配置檔案中對網站所在目錄定義以下內容

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All   
    Require all granted
</Directory>

//一般情況下是 AllowOverride  None  改成 All  後即表示整臺伺服器上都支援URL規則重寫,apache伺服器要讀取每個專案目錄下的  .htaccess 檔案  ,如果沒有這個檔案或者沒有定義任何關於url的規則就不會有效果

修改為 all 後需要重啟 apache   #sudo /etc/init.d/apache2 restart

重啟後或許會報505錯誤,解決方法  #sudo a2enmod rewrite      #sudo service apache2 restart

虛擬主機配置示例:

<VirtualHost *:80>
    #網站目錄,如果在www目錄下的php目錄,下面    #就填寫F:/www/php
    DocumentRoot "D:/phpstudy/www" 
    #域名
    ServerName  www.baidu.com
    #這裡配置預設首頁
    DirectoryIndex index.html index.htm index.php
    <Directory />
    Options FollowSymLinks
    #不允許別人修改我們的頁面,為all 時 .htaccess 檔案才生效
    AllowOverride None
    #設定訪問許可權
    order allow,deny
    Allow from all
    </Directory>   
</VirtualHost>

/usr/local/apache/conf/httpd.conf  配置

      options Indexes followsymlinks    #翻譯後為  選項索引跟隨連結
      allowoverride all                              #允許重寫
      rewriteengine on                             #重寫引擎
      rewritebase / 
      rewriterule ^(.*)$ index.html [R=301] 
rewritebase / 的作用是如果在下面的rewriterule定義中被重寫後的部分 (此處為檔名index.html) 前面沒有 /,則是相對目錄,相對於這個rewritebase後面的定義也就是 /usr/local/apache/htdocs/index.html ,否則,如果此處沒有 rewritebase / 這一項,則被重寫成http://127.0.0.1/usr/local/apache/htdocs/manual/index.html 顯然是不正確的。 通常不用寫 rewritebase  /  這一項,而直接在rewriterule ^(.*)$  /index.html [R=301]  寫 / 就可以,或者是 rewriterule ^(.*)$ http://127.0.0.1/index.html [R=301] 

還有一些選項:

RewriteCond %{HTTP_HOST} !^www.baidu.com [NC] #宣告客戶端請求的主機中字首不是www.baidu.com,其中 [NC] 的意思是忽略大小寫 
RewriteCond %{HTTP_HOST} !^127.0.0.1 [NC] #宣告客戶端請求的主機中字首不是127.0.0.1,其中 [NC] 的意思是忽略大小寫 
RewriteCond %{HTTP_HOST} !^$ #宣告客戶端請求的主機中字首不為空 

RewriteRule ^(.*) http://www.pdanda.com/ [L] #含義是如果客戶端請求的主機中的字首符合上述條件,則直接進行跳轉到http://www.pdanda.com/,[L]意味著立即停止重寫操作,並不再應用其他重寫規則。這裡的 .* 是指匹配所有URL中不包含換行字元,()括號的功能是把所有的字元做一個標記,以便於後面的應用.就是引用前面裡的 (.*)字元。

RewriteCond %{HTTP_HOST} ^wx.baidu.con [NC] 
RewriteRule ^(.*) http://www.baidu.com/ [L]

上邊兩行的意思是將訪問的網路地址是wx.baidu.com 的時候跳轉到 http://www.baidu.com

 .htaccess  檔案

RewriteEngine On   #重寫引擎  On 開啟,如果為 off 則重寫不起作用,不用再去註釋掉下方的重寫規則
RewriteMap lowercase int:tolower
RewriteCond ${lowercase:%{SERVER_NAME}} ^[a-z0-9]+.eact.com.cn$    #重寫條件
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]     #重寫規則

使用 .htaccess 前需要把 httpd.conf 中的  AllowOverride 設為 all

Apache Rewrite規則的書寫 

#當訪問任何以t_開頭,以.html結尾的檔案時,將$1用與(.*)匹配的字元替換後,訪問相應的test.php頁面 
RewriteRule ^/t_(.*).html$ /test.php?id=$1

#當我們訪問的地址不是以www.163.com開頭的,那麼執行下一條規則 
RewriteCond %{HTTP_HOST} !^www.163.com [NC] 
RewriteRule ^/(.*) http://www.163.com/ [L] 

Apache Rewrite規則修正符 
1) R 強制外部重定向 
2) F 禁用URL,返回403HTTP狀態碼。 
3) G 強制URL為GONE,返回410HTTP狀態碼。 
4) P 強制使用代理轉發。 
5) L 表明當前規則是最後一條規則,停止分析以後規則的重寫。 
6) N 重新從第一條規則開始執行重寫過程。 
7) C 與下一條規則關聯 

如果規則匹配則正常處理,以下修正符無效 
8) T=MIME-type(force MIME type) 強制MIME型別 
9) NS 只用於不是內部子請求 
10) NC 不區分大小寫 
11) QSA 追加請求字串 
12) NE 不在輸出轉義特殊字元 \%3d$1 等價於 =$1

重寫中設計到的特殊字元的含義【與正則表示式有些相似】

* 代表前面0或更多個字元

+ 代表前面1或更多個字元

? 代表前面0或1個字元

^ 代表字串的開始位置

$ 代表字串結束的位置

。為萬用字元,代表任何字元

\將跟在其後的字元還原為字元本身,例如“\+”代表的就是“+”,而非其它意思。

^在方括號裡表示非的意思。例如[^.]代表非萬用字元。

檔案不存在時的重定向

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? /404.php [L]

這裡   -f  匹配的是存在的檔名,-d  匹配的存在的路徑名。這段程式碼在進行404重定向之前,會判斷你的檔名以及路徑名是否存在,也就是在檔名和目錄不存在的時候跳轉404。你還可以在404頁面上加一個?url=$1引數:

RewriteRule ^/?(.*)$ /404.php?url=$1 [L]

偽靜態

RewriteEngine on

RewriteRule ^test([0-9]*).html$ /index.php?id=$1

將.html字尾名轉換成.php

RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]