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]