利用apache的mod_rewrite做URL規則重寫


使用mod_rewrite做url重寫,偽靜態,做過很多次,這次用幾個例子記下來,便於后面查用。

使用方法:

 1.在conf目錄的httpd.conf文件中找到:

           LoadModule rewrite_module modules/mod_rewrite.so

 

2.在要支持url rewirte的目錄啟用 Options FollowSymLinks和AllowOverride All

  <Directory "D:/WAMP/Mypro/">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>

這樣通過http://localhost/Mypro/訪問時,/Mypro/和其下面的子目錄將支持url rewrite。

3.在Mypro根目錄下添加.htaccess文件,添加規則:

RewriteEngine on

 

#針對phpcms的url結構

RewriteRule ^content-([0-9]+)-([0-9]+)-([0-9]+).html index.php?m=content&c=index&a=show&catid=$1&id=$2&page=$3

-----------------------------

下面給三個淺顯易懂的例子:

<1>


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

 

RewriteEngine on:開啟Rewrite

RewriteCond $1 !(index.php|images):如果文件不為index.php或目錄不為images。

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

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

設置之后,當訪問dmyz.org/about時,實際是訪問dmyz.org/index.php?page=about,從url中省略掉了index.php。這一規則經常用於框架開發環境,因為大多數框架都是將所有的請求提交給一個入口文件(通常是index.php)來處理的。

將第三行修改:

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

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

------------------------------

<2>

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

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

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

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

------------------------------

<3>

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

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

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

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

[NC]:忽略大小寫。

[L]:結尾標識。停止重寫操作,並不再應用其他重寫規則。防止本條規則被后續規則影響。

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

----------------------------------------------------

一個常見的問題:配置完rewrite后有時會顯示Forbidden  You don't have permission to access /Mypro/blog/ on this server.這樣的錯誤。

加上Options FollowSymLinks就行了,注意不能加Indexes,這個表示顯示目錄(根目錄沒有index.html的情況下就顯示文件夾的目錄結構)。

實際上mod_rewrite是針對目錄的,因此並不需要將httpd.conf中的所有AllowOverride None改為AllowOverride All,Options也一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM