Apache地址重寫的配置分爲兩種方式,即經過httpd.conf配置和.htaccess文件。php
首先要打開rewrite模塊,windows下的配置是html
LoadModule rewrite_module modules/mod_rewrite.soweb
httpd.conf的配置能夠全局生效,也能夠只配置一個目錄,須要作的事情是在相應目錄的Directory標籤下配置Rewrite規則。正則表達式
.htaccess的則放到相應目錄下(或者根目錄)便可,這是VPS裏經常使用的一種方式,畢竟做爲一個VPS購買者不可能要求提供商去更改全局配置文件。這種方式須要注意的有以下兩點:windows
首先,.htaccess要想起做用,必需要在httpd.conf中相應的Directory標籤下配置AllowOverride All(默認是None),其次是windows下這種無文件名僅有擴展名的文件是沒法直接生成的,能夠在cmd窗口下使用copy con命令來生成(這命令也有年頭了,我小學的時候還學過,光陰荏苒啊,扯遠了…),Ctrl+Z<Enter>保存。ide
而後咱們說一下幾個概念。測試
首先是RewriteEngine,這是地址重寫的引擎,能夠方便的設置爲On或者Off來啓用和關閉引擎。網站
其次是RewriteCond,地址重寫的條件,符合這個條件的才進行表達式判斷和重寫,這樣能有效減小匹配的條數,提升重寫效率。code
最後是RewriteBase和RewriteRule,RewriteBase指明重定向地址的基礎,即RewriteRule後一部分重定向地址會拼合上RewriteBase,合成一個完整的重定向地址。這在一個web容器下有多個網站的時候比較有用。htm
RewriteRule纔是咱們討論的主要話題。RewriteRule實現把符合表達式的地址重定向到另外一個地址的功能,RewriteRule的語法相似於下面
RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2
RewriteRule緊跟着判斷表達式,以後是須要重定向的位置,正則表達式()會捕獲一個分組,而後經過$n引用這個分組,從而實現地址重寫。RewriteRule匹配的開始位置是整個URL去掉當前目錄後剩下的部分,好比我在/discuz配置上面所示的RewriteRule,而後輸入一個URL-http://localhost/discuz/forum-1-1.html,被用來匹配的輸入會是forum-1-1.html,也就是前面的/discuz/被吃掉了。對於整個問題,咱們能夠用以下的語句驗證。
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ rewrite.php?param=$1
注:在rewrite.php裏打印一下GET['param’]參數
另外這裏須要說明的是,若是我定義了
RewriteBase /discuz
那麼前面的^forum-([0-9]+)-([0-9]+)\.html$不受影響,可是後面會變成/discuz/forumdisplay.php?fid=$1&page=$2。不過RewriteBase並非必須的,如有指定RewriteBase,結果爲RewriteBase+重定向地址,不然爲當前目錄+重定向地址。這裏當前目錄指的是.htaccess所在目錄(使用.htaccess的時候)或者Directory標籤指定的目錄(使用httpd.conf的時候)。
以上操做在windows下測試經過。
參考文獻:
[1]Apache中RewriteCond規則參數介紹,
http://hi.baidu.com/%D2%BB%CE%C4%CC%EC/blog/item/ace7f14e19851cc4d0c86af2.html
[2]RewriteRule-htaccess詳細語法使用教程,
http://www.3code.cn/rewriterule-htaccess%E8%AF%A6%E7%BB%86%E8%AF%AD%E6%B3%95%E4%BD%BF%E7